2012-02-09 6 views
1

私は多くのドキュメントに対処する必要のあるマルチスレッド動作とcore dataアプリケーション、に取り組んでいます複数のスレッドでのコアデータ操作、メモリリーク?

を解決しました。

これらのドキュメントの詳細を使用して、コアデータに挿入、削除、更新などを実行しています。

膨大な数のデータを処理しているので、スレッド操作ごとに別々のNSManagedObjectContextを使用しています(mainThreadの主なコンテキストを維持する)。

私は便利なNSManagedObjectContext管理のために、コンテキストをスレッド辞書に設定しました。

このメソッドを使用すると、重要なメモリが紛失することはありませんが、xcode計測器リークツールを実行すると、NSManagedObjectContextに関連するリークオブジェクトの数が表示されます。

しかし、スレッド終了時にコンテキストが完全に削除されていることがわかりました(現在のスレッドは操作後に自身を強制終了するため、スレッド辞書も消去されています)。

大きなドキュメントを扱う一方で、それはメモリの問題原因managedObjectContext

-(NSManagedObjectContext*)managedObjectContext  { 

    NSManagedObjectContext *context = nil; 
    if ([NSThread isMainThread]) { 
     if (!managedObjectContext) { 
      context = [NSManagedObjectContext newContextForPersistentStoreCoordinator:[self persistentStoreCoordinator]]; 
       [self setManagedObjectContext:context]; 
     } 

     context = managedObjectContext; 
    } 
    else { 
     //find context for this thread. 
     NSMutableDictionary *threadDictionary = [[NSThread currentThread] threadDictionary]; 
     context = [threadDictionary objectForKey:kManagedObjectContextKey]; 
     if (!context) { 
      //create a new context for this thread. 
      context = [NSManagedObjectContext newContextForPersistentStoreCoordinator:[self persistentStoreCoordinator]]; 
      [threadDictionary setObject:context forKey:kManagedObjectContextKey]; 
      [context setUndoManager:nil]; 

      //to start observing context through DidSaveNotification. 
      [self startObserveContext:context]; 
     } 
    } 

    return context; 
} 

を取得するためのコードを与え、私がメイン/シングルのみ使用されたとき何のリークを示していない楽器が示しNSManagedObjectContext.But以下

ので、私はのために別々のNSManagedObjectContextを必要とします各スレッド操作

はいずれも、この問題のために良い解決策がどうなるか、を教えてもらえます?...複数のスレッドでコアデータコンテキストを処理するための 他の方法は...

をいただければ幸いです

ありがとうございます

答えて

0

私は私のコードで以下のように変更

-(NSManagedObjectContext*)managedObjectContext  { 

    NSManagedObjectContext *context = nil; 
    if ([NSThread isMainThread]) { 
     if (!managedObjectContext) { 
      context = [NSManagedObjectContext newContextForPersistentStoreCoordinator:[self persistentStoreCoordinator]]; 
       [self setManagedObjectContext:context]; 
     } 

     context = managedObjectContext; 
    } 
    else { 
     //find context for this thread. 
     NSMutableDictionary *threadDictionary = [[NSThread currentThread] threadDictionary]; 
     context = [threadDictionary objectForKey:kManagedObjectContextKey]; 
     if (!context) { 
      //create a new context for this thread. 
      context = [NSManagedObjectContext newContextForPersistentStoreCoordinator:[self persistentStoreCoordinator]]; 
      [context setUndoManager:nil]; 

      //to start observing context through DidSaveNotification. 
      [self startObserveContext:context]; 
      [threadDictionary setObject:context forKey:kManagedObjectContextKey]; 
      [context release] 
      context = nil; 

return [threadDictionary objectForKey:kManagedObjectContextKey]; 
     } 
    } 

    return context; 
} 

Previoulsyインクルードを変​​更しました[NSManagedObjectContext newContextForPersistentStoreCoordinator:[self persistentStoreCoordinator]];メソッドの戻り値は(iは、自動解放を除去

及び動作開始{}の方法において、iは開始に..すべての機能後

マイNSOperationクラス

start { 
......... 
........ 
....... 
NSManagedObjectContext *currentContext = (NSManagedObjectContext *)[[[NSThread currentThread] threadDictionary] objectForKey:kManagedObjectContextKey]; 
    [currentContext reset]; 
    [[[NSThread currentThread] threadDictionary] removeObjectForKey:kManagedObjectContextKey]; 
    currentContext = nil; 

} 

を追加し、開始終了をNSManagedObjectContextを自動解放しましたコンテキストを削除する行が追加されました)。

0

スレッドとスレッド辞書の代わりに、ブロックを使用しないでください。ここでの素敵な説明があります:http://www.cimgf.com/2011/05/04/core-data-and-threads-without-the-headache/

(私は、私が使用するメソッドを投稿する程度だったが、そのチュートリアルがはるかに優れている)

+0

アイデア@Marceloさんありがとうございます。問題は既にプロジェクトのほとんどすべてのモジュールが終了しているので、これをブロックに変更すると難しいと思います...?または投稿できますかあなたが使った方法? – Raj

+0

あなたが与えたリンクを確認しました。彼らはgit hub MagicalRecord(http:// github。com/magicalpanda/magicalrecord)、同じこと(スレッド辞書のコンテキストを設定する)もあります – Raj

関連する問題