Используйте GCD — это текущая официальная рекомендация, и она требует меньше усилий, чем любое другое решение. Если вам явно нужно, чтобы вещи, которые вы передаете, происходили последовательно (т. е. как в одном потоке), вы можете добиться этого, но, вероятно, разумнее просто изменить, например.
[self doCostlyTask];
To:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^()
{
[self doCostlyTask];
dispatch_async(dispatch_get_main_queue(), ^()
{
// most UIKit tasks are permissible only from the main queue or thread,
// so if you want to update an UI as a result of the completed action,
// this is a safe way to proceed
[self costlyTaskIsFinished];
});
});
По сути, это говорит ОС «выполнять этот код с низким приоритетом там, где это было бы наиболее эффективно». Различные вещи, которые вы отправляете в любую из глобальных очередей, могут выполняться или не выполняться в одном потоке друг с другом и в потоке, который их отправил, и могут выполняться или не выполняться одновременно. ОС применяет правила, которые считает оптимальными.
Экспозиция:
GCD — это реализация Apple пула потоков, и в то же время они представили замыкания (как «блоки»), чтобы сделать его пригодным для использования. Таким образом, синтаксис ^(C-style args){code}
— это блок/замыкание. То есть это код плюс состояние любых переменных (с учетом оговорок), на которые ссылается код. Вы можете хранить и вызывать блоки самостоятельно, не зная и не используя GCD.
dispatch_async
— это функция GCD, которая отправляет блок в указанную очередь. Он выполняет блок в каком-то потоке в какое-то время и применяет неуказанные внутренние правила, чтобы сделать это оптимальным образом. Он будет судить об этом на основе таких факторов, как количество ядер, которые у вас есть, насколько загружено каждое из них, что он в настоящее время думает об энергосбережении (что может зависеть от источника питания), как работают затраты на электроэнергию для этого конкретного процессора и т. д.
Так что, насколько развит программист, блоки превращают код во что-то, что вы можете передавать в качестве аргумента. GCD позволяет вам запрашивать выполнение блоков в соответствии с наилучшим расписанием, которым может управлять ОС. Блоки очень легко создавать и копировать — намного легче, чем, например. NSOperation
с.
GCD выходит за рамки базовой асинхронной отправки в приведенном выше примере (например, вы можете выполнить параллельный цикл for и дождаться его завершения в одном вызове), но если у вас нет особых потребностей, это, вероятно, не так уж важно.
person
Tommy
schedule
14.11.2011
performSelector:onThread:withObject:waitUntilDone:
для объекта с глобальным потоком кажется мне довольно простым? Вы ищете более простой метод? - person ColdLogic   schedule 14.11.2011NSRunloop
. - person Tommy   schedule 14.11.2011