Довольно общий вопрос, есть ли способ вызвать метод, который у меня есть так часто с приложением, не блокируя загрузку пользовательского интерфейса?Как я могу вызвать метод неоднократно, не блокируя интерфейс?
ответ
Вы можете использовать Grand Central Dispatch для этого:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, kNilOptions), ^{
// Call your method.
});
Будет ли это рекурсивно назвать это? – Tukajo
Теперь я вижу, что вы отметили вопрос «рекурсия». Нет, это просто выполняет любой код, который вы помещаете в блок в фоновом потоке. Вы можете, конечно, использовать GCD в тандеме с рекурсией или итерацией. Цель GCD - улучшить параллельное выполнение кода. – geraldWilliam
Для тех, кто находит этот вопрос, не забудьте проверить ответ от 0x7fffffff относительно dispatch_apply. – geraldWilliam
Вы могли бы использовать:
[self performSelectorInBackground:@selector(aMethod) withObject:nil];
для метода без параметров. Или что-то вроде
[self performSelectorInBackground:@selector(otherMethodWithString:andData:) withObjects:string, data, nil];
если у вас есть параметры.
Вот еще один пример, объясняющий, как выполнять фоновые очереди и выполнять итерацию с пользователем внутри него.
- (void)method
{
// start a background proccess that will not block the UI
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
for (int i = 0; i < 1000000; i++) {
if (i == 999) {
// Need to iterate with interface elements when inside a background thread.
dispatch_async(dispatch_get_main_queue(), ^{
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Found" message:@"Found your number" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
[alertView show];
});
}
NSLog(@"Count: %d",i);
}
});
}
Вы хотите 'i <1000000', а не' i> 1000000'. – rmaddy
спасибо, исправил его. – alexandresoli
Он показывает только одно предупреждение, когда он находит номер 999. – alexandresoli
Использование GCD - это, безусловно, хороший способ, как отмечали другие.
В качестве альтернативы, если вы хотите, чтобы операция была отменена (например, загрузка веб-ресурса), вы можете рассмотреть подклассификацию NSOperation
и проверку на наличие isCancelled
.
(AFNetworking на самом деле это делает (например, AFHTTPRequestOperationManager
) в принятии/управление веб-запросов.)
заказ яблоке документы на NSOperation
, а также this tutorial on Ray Wenderlich's site для получения более подробной информации о NSOperation
с.
Чтобы сделать это, вы определенно хотите использовать Grand Central Dispatch, но я хотел бы указать, что GCD имеет метод построения только для такого рода вещей. dispatch_apply()
выполняет свой блок определенное количество раз в выбранной вами очереди, конечно, отслеживая, на какой итерации вы находитесь на этом пути. Вот пример:
size_t iterations = 10;
dispatch_queue_t queue = dispatch_queue_create("com.my.queue", DISPATCH_QUEUE_SERIAL);
dispatch_apply(iterations, queue, ^(size_t i) {
NSLog(@"%zu",i);// Off the main thread.
dispatch_async(dispatch_get_main_queue(), ^{
// Go back to main queue for UI updates and such
});
});
- 1. Android - метод неоднократно не подвергается
- 2. Threading: обновить интерфейс, не блокируя поток?
- 3. Как я могу вызвать Timer как метод?
- 4. Как я могу вызвать метод в Squeak?
- 5. Как я могу вызвать метод из ViewController?
- 6. Как я могу вызвать метод из powershell?
- 7. Как я могу вызвать мой метод python
- 8. Как я могу вызвать нестатический метод (массивы)
- 9. Как я могу вызвать метод службы wcf?
- 10. Как я могу вызвать метод внутри onPostExecute()?
- 11. Как я могу вызвать метод изменения свойства?
- 12. Как я могу вызвать метод magic `__contains__`?
- 13. Как вызвать метод, который возвращает интерфейс
- 14. Как я могу вызвать метод async как метод синхронизации?
- 15. Как я могу вызвать несколько компонентов, которые реализуют определенный интерфейс?
- 16. Как я могу вызвать метод из класса Метод
- 17. Как я могу решить «Не удается вызвать метод« addL »undefined»
- 18. Почему я не могу вызвать метод возврата e.getSource()?
- 19. Не могу вызвать метод iterator() моего объекта
- 20. Могу ли я вызвать метод перед конструктором
- 21. Как я могу вызвать метод, который имеет интерфейс как один из параметров в C#?
- 22. Я не могу вызвать метод из класса, который расширяет мой интерфейс List
- 23. Возможно ли перерисовать сайт asynchron (не блокируя пользовательский интерфейс)?
- 24. Почему я не могу вызвать метод на nativeApplication.applicationDescriptor в Javascript?
- 25. Почему я не могу вызвать метод класса с его объектом?
- 26. Почему я не могу вызвать метод протокола из метода класса?
- 27. Я не могу вызвать метод, используя apache camel quartz2
- 28. Почему я могу вызвать Form.Close(), если это не статический метод
- 29. Как я могу вызвать конструктор службы WCF?
- 30. Почему я не могу вызвать свой метод WriteLogDataToDb?
Называть его фоновой нитью –