だから私はGCDを理解しようとしています。次のようにダウンロードした後にデータを追加するだけの長時間実行オペレーションがあります。
NSFileManager *fileManager = [NSFileManager defaultManager];
__block NSFileHandle *output;
output = [NSFileHandle fileHandleForUpdatingAtPath:tempPath];
__block NSError *error = nil;
BOOL success;
dispatch_queue_t stitchQueue = dispatch_queue_create("com.test", NULL);
for (NSString *packetName in listOfFiles) {
dispatch_async(stitchQueue, {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSString *packetPath = [[self applicationDocumentsDirectory] stringByAppendingPathComponent:packetName];
NSData *packetData = [[NSData alloc] initWithContentsOfFile:packetPath];
[output seekToEndOfFile];
[output writeData:packetData];
[fileManager removeItemAtPath:packetPath error:&error];
NSLog(@"Removed file after appending data success: %i Error: %@", success, [error localizedDescription]);
[self updateManifestColumn:@"IsParsed" withValue:YES forFile:packetName inTable:tableName];
packetData = nil;
[packetData release];
[pool release];
});
}
[output closeFile];
//dispatch_async( // データが結合された後、次の長期実行タスクを実行します)
このコードは、dispatch_async 呼び出しを削除すると機能します。私は何か間違ったことをしていますか?dispatch_async で実行すると、1 回の反復を正常に完了してからクラッシュします。NSFileHandle への不正なアクセスでクラッシュします。1回の反復後に解放されたようです。これを修正するために何をする必要があるのか わかりません。ありがとう!