Подтвердить что ты не робот

Как запустить код в потоке пользовательского интерфейса, вызвав его из других

В Android существует несколько способов запустить некоторый код в основном потоке из других:

 1. Activity.runOnUiThread(Runnable r)
 2. new Handler.post(Runnable r);
 3. View.post

Каковы аналоги в iOS?

 dispatch_async(dispatch_get_main_queue(), ^{

    });

Что-то еще?

Спасибо заранее.

4b9b3361

Ответ 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:] позволяет передавать произвольный код (используя блок).