Web サービス経由でデータをフェッチし、そのデータを Core Data データストアに保持し、デリゲート メソッド経由で ViewController を更新する DataFetcher というモデル クラスがあります。NSOperation を使用しない場合の通常のシーケンス (正常に動作する) は次のとおりです。
NSArray *serviceQueryResult = [self queryServiceFor:@"car"];
[self setData:serviceQueryResult];
[self persistData:_data];
[_loadDelegate updateCount:_data.count];
[_loadDelegate receivedData:_data];
Web サービス呼び出しとデータベース更新呼び出しをバックグラウンド スレッドに配置する必要があります。私の考えでは、NSBlockOperation を作成して Web サービスを呼び出し、次に別の NSBlockOperation を作成してデータベースの更新を行うことです。データベースの更新操作が開始される前に Web サービス操作が完了するという依存関係があります。実装しようとしているコードは次のとおりです。
__weak DataFetcher *weakSelf = self;
__block NSArray *serviceQUeryResult;
NSBlockOperation *webServiceOperation = [NSBlockOperation blockOperationWithBlock:^{
serviceQUeryResult = [weakSelf queryServiceFor:@"mini"];
[weakSelf setData:serviceQUeryResult];
}];
NSBlockOperation *dbInsertOperation = [NSBlockOperation blockOperationWithBlock:^{
[weakSelf persistData:serviceQUeryResult];
}];
[webServiceOperation addDependency:dbInsertOperation];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue addOperation:webServiceOperation];
このように設定すると、 queryServiceFor: メソッドが呼び出されません。2 つのデリゲート メソッド呼び出しは UI を更新し、メイン スレッド上にある必要があるため、どこに配置すればよいかもわかりません。過去に何度か GCD を使用しましたが、NSOperations の追加機能が必要になります。誰でも助けることができますか?ありがとう!