与NSOperationQueue同步执行多个NSOpeartion

时间:2011-10-14 11:44:41

标签: ios core-data nsoperation nsoperationqueue

我必须在后台进程中从Server下载多个文件。 为此我使用NSOperationQueue。在下载过程中,我需要在下载开始时进行维护。完成。为此我一直在使用Core Data。 我一直在使用以下方法: 每个文件都有NSManagedObject

  1. 因此,在开始下载之前,我将核心数据中的文件状态保存为“已启动”
  2. NSOperation子类就在那里。为我传递托管对象实例的每个文件创建了实例。然后将其添加到NSOperationQueue
  3. 然后在NSOperation子类的main()方法中执行实际的文件下载。
  4. 下载完成后,我将核心数据中的fiel状态保存为“已完成”。
  5. 这适用于单个文件。但对于多个文件,我执行for循环中的步骤1到4。 这个destroy NSMangedObject传递给NSOperation子类进行for循环的第二次迭代 这就是我称呼它的方式

    for(NSManagedObject *objToDownload in objectArr){
        NSManagedObjectContext *ctx = [[NSManagedObjectContext alloc] init];
        [ctx setPersistentStoreCoordinator: [[[UIApplication sharedApplication] delegate] persistentStoreCoordinator]];
    
        offlineManagerObj = [[OfflineFileManager alloc]initWithManagedObj:objToDownload delegate:self tempOfflineAccessPath:[objToDownload valueForKey:@"path"] objContext:ctx];
    
        [queue setMaxConcurrentOperationCount:1];
        [queue addOperation:offlineManagerObj];
        [ctx release];
    }
    

    我收到了崩溃日志

    #0  0x31b6b4b0 in ___forwarding___ ()
    #1  0x31ae2180 in __forwarding_prep_0___ ()
    #2  0x363b904e in -[_PFArray dealloc] ()
    #3  0x363b6b80 in -[_PFArray release] ()
    #4  0x31acd1a0 in CFRelease ()
    #5  0x31acfeba in _CFAutoreleasePoolPop ()
    #6  0x310ae1ca in -[NSAutoreleasePool release] ()
    #7  0x370bff0e in _UIApplicationHandleEvent ()
    #8  0x35bc0e76 in PurpleEventCallback ()
    #9  0x31b3fa96 in __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ ()
    #10 0x31b4183e in __CFRunLoopDoSource1 ()
    #11 0x31b4260c in __CFRunLoopRun ()
    #12 0x31ad2ec2 in CFRunLoopRunSpecific ()
    #13 0x31ad2dca in CFRunLoopRunInMode ()
    #14 0x35bc041e in GSEventRunModal ()
    #15 0x35bc04ca in GSEventRun ()
    #16 0x370ead68 in -[UIApplication _run] ()
    #17 0x370e8806 in UIApplicationMain ()
    #18 0x00002482 in main (argc=1, argv=0x2fdff494) at /Projects/iOS_Universal/main.m:14
    

    我甚至尝试设置NSZombieEnabled,但这也没有帮助我获得过度释放的对象

1 个答案:

答案 0 :(得分:0)

你应该在循环之外分配上下文,并在之后释放它。

此外,如果您希望对象持久存在,则需要save上下文。