0

メソッドが非同期で実行されているかどうかを確認するにはどうすればよいですか?

非同期ディスパッチ キュー (GCD) を介して非同期的に呼び出されることもあれば、同期的に呼び出されることもあるコア データ関連のメソッドがいくつかあります。

// sometimes this happens
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
  [[DataServices sharedInstance] doSomeCoreDataStuff:^(BOOL result, NSString *message) 
  {
      // do some post-stuff here        
  }];
});

// other times this happens
[[DataServices sharedInstance] doSomeCoreDataStuff:^(BOOL result, NSString *message) 
{
    // do some post-stuff here        
}];

これに加えてNSManagedObjectContext、アプリ全体でシングルトンを使用しています。コンテキストはスレッド セーフではないため、コア データ メソッドが非同期で実行されている場合は、それらのメソッド内に新しいコンテキストを作成する必要があります。それ以外の場合は、シングルトン インスタンス コンテキストを使用します。

頭に浮かぶ唯一のアプローチは次のようなものです[[NSThread mainThread] isMainThread]が、GCDはメインスレッドで機能する場合と機能しない場合があるため、これは機能しません。

4

1 に答える 1

3

これに対処する正しい方法は、管理対象オブジェクト コンテキストを構成して、スレッド制限同時実行型のNSPrivateQueueConcurrencyTypeいずれかを使用するようにし、必要に応じてNSMainQueueConcurrencyTypeそのperformBlock:メソッドを使用することです。あれは、

[[DataServices sharedInstance] performBlock:^{
    // do Core Data stuff here
}];

これは、任意のスレッドまたはキューで行うことができ、非同期です。performBlockAndWait:すぐに結果を取得する必要がある場合もあります。

どこでもその呼び出しを使用します。唯一の例外は、使用NSMainQueueConcurrencyTypeしていて、メイン キューで実行していることがわかっている場合、コンテキストを介してではなく直接呼び出すことができることです。performBlock:

于 2013-03-01T17:53:48.650 に答える