Ответ 1
В настоящее время предпочтительным способом является использование GCD с кодом, указанным в вашем вопросе:
dispatch_async(dispatch_get_main_queue(), ^{
// Your code to run on the main queue/thread
});
Если вы предпочитаете использовать более объектно-ориентированный подход, чем GCD, вы также можете использовать NSOperation
(например, NSBlockOperation
) и добавить его в [NSOperationQueue mainQueue]
.
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
// Your code to run on the main queue/thread
}];
Это делает то же самое, что и dispatch_async(dispatch_get_main_queue(), …)
, имеет то преимущество, что более Objective-C/POO ориентировано, чем простая функция C GCD, но имеет недостаток в необходимости выделения памяти для создания объектов NSOperation
тогда как вы можете избежать этого, используя простые C и GCD.
Я рекомендую использовать GCD, но есть и другие способы, такие как два, которые позволяют вам вызывать селектор (метод) для данного объекта из основного потока:
-
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait
(метод NSObject, поэтому его можно вызвать на любой объект) - Отправьте
- (void)performSelector:(SEL)aSelector target:(id)target argument:(id)anArgument order:(NSUInteger)order modes:(NSArray *)modes
на[NSRunLoop mainRunLoop]
Но эти решения не так гибки, как GCD или NSOperation
, потому что они позволяют только вызывать существующие методы (поэтому ваш объект должен иметь уже существующий метод и выполняет то, что вы хотите выполнить), тогда как GCD или -[NSOperationQueue addOperationWithBlock:]
позволяет передавать произвольный код (используя блок).