4

私はこれについてかなりの調査を行いましたが、私は自分の問題について精神的なブロックを抱えています. iOS アプリの Objective-C に取り組んでいます

これが私のセットアップです:

  1. ビュー コントローラーは、ビュー (ユーザー入力) からテキストを取得し、そのテキストをモデルの MethodA に渡します。

  2. モデルの MethodA は、入力テキストに対して機能し、出力を取得します (たとえば、Google でそのテキストを検索します)。モデル内の MethodB にセレクターを呼び出す dispatch_async メソッドを使用して検索を行います。

  3. MethodB は出力を解析し、すべての結果を NSMutableArray に入れます

  4. ここでの私の質問:ビューに表示できるように、その NSMutableArray をビュー コントローラーに戻すにはどうすればよいですか?

申し訳ありませんが、私の質問に対する答えが非常に単純/明白である場合は. 私はObjective-Cが初めてです

4

5 に答える 5

7

非同期処理を実行したいときに、そのようなものをどこかでUIに戻す必要があるときはいつでも、次の2つのいずれかを実行します。

1. Use NSNotification to tell anyone who cares that the work is complete
2. Use a delegate property on the worker and a @protocol

1NSNotification

モデルオブジェクトは、特定のことが発生したときに通知を発行することを.hファイルに文書化する必要があります。モデルの一部が更新されたときなど。ViewControllerがモデルオブジェクトを初期化するときに、ドキュメント化された通知のオブザーバーとしてそれ自体を設定し、UIを更新するコールバックを実装します。

2つの委任と@protocol

@protocol FooModelUpdateDelegateなどの適切な名前のメソッドを使用して@protocolを作成するfooObjectDidUpdate:(Foo *)object;と、モデルクラスにデリゲートプロパティがid<FooModelUpdateDelegate> updateDelegateあり、ViewControllerがそれ自体をそのデリゲートとして設定します。残りは理解できると思います。

于 2012-07-09T04:20:37.300 に答える
3

応答するデリゲート オブジェクトをセレクター メソッドに渡し、処理されたデータを使用してこのメ​​ソッドを呼び出すことは、プログラムにふさわしいルーズリー結合構造を実現するための良い方法になると思います。この概念に精通していますか、それともコードサンプルをいくつか掘り下げましょうか?


更新: コード サンプル

したがって、次のようMyViewControllerに、callbackMethod を実装するために、おそらく呼び出しクラスを使用します。myCallbackMethod

-(void) myCallbakcMethod: NSMutableArray* array {
    //DoWhatever with the returned data
}

ポイントは、計算が終了したときにこのメソッドに返される結果を取得することです。したがって、MyViewController呼び出す場所ではMethodA、結果を処理するデリゲートへの参照 namly を渡しselfます。

//From this:
[MyModel methodA:param1]
//To:
[MyModel methodA:param1:self]

MyModelパラメータを追加して、呼び出し間でそれを渡す必要がmethodAあります。methodB(id)delegate

methodBデータの準備ができたら、次myArrayの呼び出しを行います。

    if([delegate respondsToSelector:@selector(myCallbackMethod:)]])
        [observer performSelector:@selector(myCallbackMethod:) withObject:myArray];
于 2012-07-09T04:00:41.087 に答える
2

ビューコントローラの場合:

    // your controller code
    ...
    [myModel getSearchResult:searchKeyword receiver:self action:@selector(responseReceived:)];
}

- (void)responseReceived:(MyModel *)model
{   
    NSArray *searchResult = model.searchResult; 
    [model release], model = nil;
    // some view actions, for instance update your table view
    ...
}

モデル内:

...
- (id)getSearchResult:(NSString *)searchKeyword receiver:(id)aReceiver action:(SEL)receiverAction {
    self.receiver = aReceiver;
    self.action = receiverAction;
    // some async actions
}

非同期応答レシーバーの場合:

    ...
    [self.receiver performSelector:self.action withObject:self];
}
于 2012-07-09T04:31:42.293 に答える
1

あなたの説明を誤解していない限り、あなたの「モデル」クラスは必要以上のことをしているように聞こえます。この場合、コントローラーの作業の少なくとも一部を実行しています。私の提案は、methodA と methodB をビュー コントローラー (または別のコントローラー クラス) に折りたたむことです。メソッド B は、「モデル」インスタンスの NSMutableArray プロパティを設定することができます (必須でない場合はスキップします)。

于 2012-07-09T03:59:17.700 に答える
0
-(void)methodA {
    NSMutableArray *someArray = ...
    [self methodB:someArray];
}

-(void)methodB:(NSMutableArray*)array {
    NSLog(@"%@", array);
    // do something with the array, like update the view
}

しかし、どちらもビュー コントローラー内のメソッドである場合、ビューを別のメソッドに渡すのではなく、メソッド内のビューを更新しないのはなぜでしょうか?

于 2012-07-09T04:10:20.683 に答える