【问题标题】:Executing multiple NSOpeartion synchronously with NSOperationQueue使用 NSOperationQueue 同步执行多个 NSOperation
【发布时间】:2011-10-14 11:44:41
【问题描述】:

我必须在后台进程中从服务器下载多个文件。 为此,我使用NSOperationQueue。在下载期间,我需要在下载开始和完成时进行维护。为此,我一直在使用 Core Data。 我一直在使用以下方法: 每个文件对应一个NSManagedObject

  1. 所以在开始下载之前,我将核心数据中的文件状态保存为“已启动”
  2. NSOperation 子类在那里。为我传递 managedObject 实例的每个文件创建实例。然后将其添加到NSOperationQueue
  3. 然后在 NSOperation 子类的 main() 方法中,我进行实际的文件下载。
  4. 下载完成后,我将核心数据中的字段状态保存为“已完成”。

这适用于单个文件。但对于多个文件,我在 for 循环中执行步骤 1 到 4。 此销毁 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 但这也没有帮助我了解哪个对象被过度释放

【问题讨论】:

  • 您不需要核心数据来跟踪下载状态。只需检查 NSOperation 的标志 executingfinished
  • 但是我也需要传递 NSMangedObject 以获取我需要下载的文件。基本上该对象正在被破坏。

标签: ios core-data nsoperation nsoperationqueue


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-16
    相关资源
    最近更新 更多