2017-03-07 3 views
0

私はカップルのドメインオブジェクトを持って、メッセージと連絡先:Setオブジェクトサービスメソッド内の変数

public class Contact { 
    String name; 
} 

public class Message { 
    String body; 
    Contact contact; 
} 

私はMessageのリストを移入し、それらにユーザーを示しています。各メッセージの連絡先情報が非同期に取得され、リストが更新されます。

listAdapter.setDataSet(listOfMessages); 

for (Message message : listOfMessages) { 
    fetchContactDetails(message); 
} 

... 

fetchContactDetails(Message message) { 
    contactService 
     .fetchContactDetails(listOfMessages) 
     .subscribeOn... // observe, etc 
     .observe(new Observable<Contact>() { 
      onNext(Contact contact) { 
       message.setContact(contact); 
       list.notifyChanged(message); 
      } 
     }); 

をこれは私だけではなく、サービス機能contactService.fetchContactDetails内の各MessageContactを更新できることを考えると、多くのコードのように感じている:これは、私はそれがセットアップされているか、基本的です。逆に、何も返さずに渡されたオブジェクトを変更するサービスメソッドを使用することは不正です。

何も返さずに、引数として渡されたObjectを更新するサービス関数を使用することは悪い習慣ですか?

+0

私が追加する唯一のことは、すべてのメッセージに連絡先があると、notifyChangedを一度呼び出す必要があることです。これは、UIを1回だけ更新する必要があるため、UIのスピードアップにつながります。 –

+0

.obesrve()は何ですか?新しいObservable?私は購読を期待する – yosriz

答えて

0

何も返さずに引数として渡されたObjectを更新するのは悪い習慣ですか?

いいえ、あなたはCompletableを使用することにより、void方法Observableを実装することができますが、observeOn(AndroidSchedulers.mainThread())を追加することにより、(mainThreadにonNextをサブスクライブして処理しますので、あなたのケースであなたはまだ、メインスレッド上でUIを更新する必要があります)。
この場合、あなたのメソッドは何も返さない純粋なvoidメソッドではないようですが、データを更新してUIに返して処理するメソッドです。

だから、もっと一般的なアーキテクチャ上の問題だと思います。コードをどのように分離するのか。私は挑戦的にモデル/ドメインロジックを個別にObservableで集め、UI /プレゼンテーションにちょうどUIアップデートを処理させます。

ところで、あなたが受信して、よりエレガントにループその後、あなたはすべての更新が行われたときに何かをするように、enitreプロセスに制御を持っている、または並列処理または何を制限することができfrom()flatMap()

Observable.from(listOfMessages) 
    .flatMap(msg -> contactService.fetchContactDetails(msg)) 

を使用することができます。

関連する問題