Выполнение нескольких NSOpeartion синхронно с NSOperationQueue - PullRequest
0 голосов
/ 14 октября 2011

Мне нужно загрузить несколько файлов с сервера в фоновом режиме. для этого я использую NSOperationQueue. Во время загрузки мне нужно сохранить, когда загрузка началась и завершена. Для этого я использовал основные данные. Я использовал следующий подход: Каждому файлу соответствует NSManagedObject.

  1. Итак, перед началом загрузки я сохраняю состояние файла в основных данных как «Запущено»
  2. Существует подкласс NSOperation. Экземпляр создается для каждого файла, в котором я передаю экземпляр managedObject. Затем он добавляется к NSOperationQueue.
  3. Затем в методе main () подкласса NSOperation я делаю фактическую загрузку файла.
  4. Когда загрузка завершена, я сохраняю состояние поля в основных данных как «Завершено».

это прекрасно работает для одного файла. Но для нескольких файлов я выполняю шаги с 1 по 4 для цикла for Это уничтожение 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 голосов
/ 14 октября 2011

Вы должны выделить контекст вне цикла и освободить его после.

Также, если вы хотите, чтобы объекты сохранялись, вам нужно save контекст.

...