Технически вы могли бы разделить копирование файлов на очень маленькие куски и сообщить текущему NSRunLoop
о необходимости отправки между копиями файлов.
Но практически просто скажите "нет" любому доступу ввода-вывода в основном потоке, все доступ ввода-вывода должен выполняться в фоновом режиме. Даже малейший блок в главном потоке вызовет затруднения в работе пользовательского интерфейса и будет невосприимчив, пользователь Android может принять это, пользователь iOS - нет.
Ваши варианты многочисленны и просты в реализации. Вы могли бы сделать простой performSelector–
:
-(void)backgroundWorker {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// Do your stuff
[pool release];
}
-(void)startDoingIOStuff {
[self performSelectorInBackground:@selector(backgroundWorker)
withObject:nil];
}
Вы можете сделать это практически встроенным, используя блок и GCD:
-(void)startDoingIOStuff {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, NULL),
^{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// Do your stuff
[pool release];
});
}
Или вы можете использовать NSOperation
на NSOperationQueue
. Я написал более длинную запись в блоге на эту тему, включая исходный код, который доступен здесь: http://blog.jayway.com/2010/08/19/future-cocoa-operation/