2012-02-09 97 views
1

议决核心数据操作在多线程,内存泄漏?

我工作的一个core data应用多线程操作,其中我需要处理很多文件。

我进行插入,删除,更新等,在使用这些文件的详细信息的核心数据。

由于处理DATAS的数量巨大,我使用单独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]];方法返回自动释放的NSManagedObjectContext,我去掉了自动释放,

,并在操作开始{}方法,我添加..

我的NSOperation类

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

} 

所有功能在开始(开始的结束后添加上下文删除线)。

0

相反线程和线程字典,为什么不使用块?有一个很好的解释在这里:http://www.cimgf.com/2011/05/04/core-data-and-threads-without-the-headache/

(我正要张贴我使用的方法,但该教程是更好)

+0

非常感谢你对你的想法@Marcelo,但问题是,即时通讯已经在我的项目完成了几乎所有的模块,我认为这似乎很难,如果我改变人对这些块..?......或者你可以发布你使用的方法? – Raj 2012-02-09 14:21:16

+0

我检查了你给出的链接,他们引用了git hub MagicalRecord中的一个开源项目(http:// github。com/magicalpanda/magicalrecord),同样的事情(在线程字典中设置上下文),我们也可以在那里看到 – Raj 2012-02-10 05:13:17