Кроме того, если ваше приложение предназначено для iOS> = 4, вы можете использовать Grand Central Dispatch:
dispatch_async(dispatch_get_main_queue(), ^{
// This block will be executed asynchronously on the main thread.
});
Это полезно, когда ваша пользовательская логика не может быть легко выражена с помощью одного селектора и аргументов объекта, которые принимают методы performSelect…
.
Чтобы выполнить блок синхронно, используйте dispatch_sync()
- но убедитесь, что вы не выполняете его в основной очереди, иначе GCD заблокируется.
__block NSInteger alertResult; // The __block modifier makes alertResult writable
// from a referencing block.
void (^ getResponse)() = ^{
NSAlert *alert = …;
alertResult = [NSAlert runModal];
};
if ([NSThread isMainThread]) {
// We're currently executing on the main thread.
// We can execute the block directly.
getResponse();
} else {
dispatch_sync(dispatch_get_main_queue(), getResponse);
}
// Check the user response.
if (alertResult == …) {
…
}