0

GCDについて少し混乱しています

Web サービス呼び出しが実行されるクラスを呼び出してみます。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        [searchService doSearch:self.searchData];
});

Sudzc で生成された Web サービスを使用しています。Sudzc で生成され、SearchService クラス内にあるサービスへの実際のサービス呼び出しは次のとおりです。

 [service doSearch:self action:@selector(doSearchHandler:) e: searchArgs];

呼び出しが完了したら、次の場所に戻る必要があります。

- (void) doSearchHandler: (id) value {
}

GCD を使用しなくても問題なく動作しますが、追加すると doSearchHandler メソッドに戻ることはありません。

4

2 に答える 2

1

Sudzc 操作がメインスレッドをブロックするという問題がありました。ただし、NSURLRequest はメイン スレッドで実行されますが、そのデータはデリゲートによって管理されるため、Soap リクエストは問題ではありません。didReceiveData

UI をブロックしていたのは、Handler メソッドで発生した受信 XML の処理でした。

ハンドラー メソッド ( - (void) SudzcRequestHandler: (id) value { ...) では、次のようにデータを処理します。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

...processing...

[[NSNotificationCenter defaultCenter] postNotificationName:KManagerHasFinishedLoading object:self userInfo:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:NOTIFICATION_RESULT_OK], @"Result", nil]];

});

シングルトン オブジェクトである Manager で処理を実行しますが、他の実装は異なる場合があります。したがって、通知は、ViewController に処理が終了したことを知らせるために使用されます。

于 2012-07-20T15:40:49.970 に答える
0

Sync-Async パターンを調べる必要があります。このSOの回答からの2つのリンクが役立ちます。GCD を直接使用しません。しかし、簡単に適応できます。

于 2012-07-07T10:12:57.247 に答える