3

iPhoneアプリで断続的で再現が難しいエラーが発生しているので、同時実行性に関する仮定を確認しています。

AFNetworking v0.10.xを実行していると、次のネットワーク呼び出しがあります。

[self postPath:@"/myEndPoint"
    parameters:params
       success:^(AFHTTPRequestOperation *request, id response)
          {
              AppDelegate *appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];
              // do stuff with object context here
              [appDelegate.objectContext save];
          }     
]       
AppDelegate *appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];
// do other stuff with object context
[appDelegate.objectContext save];      

私のAppDelegateで:

-(NSManagedObjectContext*) objectContext
{
    if(nil == _objectContext)
    {
        ... set up sqlite persistent store coordinator and object model ...

        _objectContext = [[NSManagedObjectContext alloc] init];
        [_objectContext setPersistentStoreCoordinator:persistentStoreCoordinator];
        [_objectContext setMergePolicy:NSOverwriteMergePolicy];
    }
    return _objectContext;
}

このシナリオでは、並行性の問題が発生する可能性はありますか?または、言い換えると、AFNetworkingのAPIはスレッドセーフですか?NSOverwriteMergePolicyで競合をカバーできると思いましたが、クラッシュは持続します(断続的ではありますが)。

4

2 に答える 2

6

AFNetworking のコールバックは、メイン スレッドで実行されます。その結果、CoreData と対話するスレッドが 1 つしかないため、それらは「スレッドセーフ」です。管理対象オブジェクトが 1 つしかない場合は、簡単です。

アップル より:

このキューに追加されたタスクは、メイン スレッド自体で順次実行されます。したがって、このキューを、アプリケーションの他の部分で実行中の作業の同期ポイントとして使用できます。

マルチスレッドの CoreData と複数のマネージド オブジェクト コンテキストを使用する場合は、まだ多くの考慮事項があります。それらについては、rsswtmr の優れた回答を参照してください。これは私の質問に正しく回答していませんが、多くの優れた情報へのリンクを提供します。

于 2013-04-20T21:58:52.723 に答える
2

同じオブジェクト コンテキストで複数のスレッドを動作させることはできません。別のスレッドで別の変更が行われている間に、Core Data がデータの変更/コミットの途中である可能性があることを考えてみてください。スレッドごとに個別のコンテキストを作成し、安全/適切なときに変更をマージする必要があります。を使用NSOverwriteMergePolicyすると、マージ時に競合を手動で処理する必要がなくなります。

Core Data アクセスのスレッド化に関する優れた説明については、こちらを参照してください。

于 2012-11-21T05:12:18.470 に答える