2016-04-25 4 views
1

で実行されますコアデータはメインスレッドで実行する必要があります。プロパティ遅延初期化は、私が財産を持っているメインスレッド

だから私はに初期化子を変更する際に考えていた:

- (NSArray *) emails 
{ 
    if (_emails == nil) { 
     if (NSThread isMainThread]) 
     { 
      CoreDataElement* cde = [user grabCoreDataElement]; 
      _emails = [cde.emails allObjects]; 
     } 
     else 
     { 
      __block NSArray *result = nil; 
      dispatch_sync(dispatch_get_main_queue(), ^{ 
       result = self.emails; 
      }); 
      return result; 
     } 
    } 
    return _emails; 

}

だから私の質問は以下のとおりです。

  • (1)必要なMainThread執行ますか?
  • (2)上記のコードは、レイジーイニシャライザとコアデータオブジェクトのアクセスを処理する標準的な方法ですか?

答えて

2

これらはどれも正しいわけではありません。コアデータを使用していて複数のスレッドでコードが実行されている場合は、管理対象オブジェクトコンテキストを作成するときにNSMainQueueConcurrencyTypeまたはNSPrivateQueueConcurrencyTypeのいずれかを使用し、アクセスするものはいつでもperformBlock:またはperformBlockAndWait:コアデータ。 NSThreadをチェックするか、またはdispatch_syncを使用すると、最初は中断されないかもしれませんが、両方とも動作する方法に関するCore Dataの考えに違反します。このアプローチで

、あなたのメソッド内のコードは、performBlock:またはperformBlockAndWait:へのコールに包まれたが、それはすべてのないことになります。どのような方法でもコアデータにアクセスするときはいつでも、これらのメソッドを使用する必要があります。つまり、管理オブジェクトの配列を返す場合は、それらのオブジェクトの値をルックアップするときに同じブロック呼び出しを使用する必要があります。

関連する問題