Конечно, есть несколько способов, включая NSThread
, NSOperation
и старомодный libpthread
.Но наиболее удобным (особенно для простых фоновых задач) я считаю libdispatch
, также называемый Grand Central Dispatch .
Используя очереди отправки, вы можете быстро делегировать трудоемкую задачуотдельный поток (или, точнее, очередь выполнения - GCD решает, является ли это потоком или асинхронной задачей).Вот самый простой пример:
// create a dispatch queue, first argument is a C string (note no "@"), second is always NULL
dispatch_queue_t jsonParsingQueue = dispatch_queue_create("jsonParsingQueue", NULL);
// execute a task on that queue asynchronously
dispatch_async(jsonParsingQueue, ^{
[self doSomeJSONReadingAndParsing];
// once this is done, if you need to you can call
// some code on a main thread (delegates, notifications, UI updates...)
dispatch_async(dispatch_get_main_queue(), ^{
[self.viewController updateWithNewData];
});
});
// release the dispatch queue
dispatch_release(jsonParsingQueue);
Приведенный выше код будет читать данные JSON в отдельной очереди выполнения, не блокируя поток пользовательского интерфейса.Это всего лишь простой пример, и GCD предлагает гораздо больше, поэтому для получения дополнительной информации ознакомьтесь с документацией.