Фоновый поток не всегда правильный ответ.
Если ваша задача связана с ЦП, тогда фоновый поток имеет смысл, но тогда вы должны решить проблемы безопасности потока.
Если ваша задача связана с вводом / выводом, то имеет больше смысла использовать основанный на событиях API, который будет уведомлять вас о наличии данных.Вы можете хранить все в главном потоке (не нужно прибегать к хитростям для обновления пользовательского интерфейса), не блокируя основной цикл выполнения.
См., Например, NSFileHandle readInBackgroundAndNotify
: он позволяет ОС заполнить буфер изатем публикует уведомление, когда новые данные доступны.В методе наблюдения вы можете сделать это:
- (void)dataReceived:(NSNotification *)notification
{
NSDictionary *info = [notification userInfo];
NSData *newData = [info objectForKey:NSFileHandleNotificationDataItem];
[allData appendData:newData];
[progressIndicator setValue:([allData length] / totalFileLength)];
}
В идеале, вы должны анализировать по ходу, а не просто вставлять все новые данные в память, но это может оказаться невозможным для вашей конкретной структуры данных.