#objective-c #multithreading #cocoa-touch #ios #nsthread
#objective-c #многопоточность #cocoa-touch #iOS #nsthread
Вопрос:
Мне интересно, могу ли я определить время повторного выполнения потока (например, при использовании scheduledTimerWithTimeInterval
метода в NSTimer
).. У меня есть контроллер представления, где есть метод, я хочу, чтобы он выполнялся либо вручную (нажатием кнопки), либо автоматически (путем синхронизации выполнения метода). Проблема в том, что этот метод подключится к удаленному серверу и обновит результат в представлении, поэтому я не хочу, чтобы он блокировал основной поток (поток контроллера представления).
Я не знаю, что использовать, поэтому, если кто-нибудь знает, как, пожалуйста, дайте мне знать 🙂 Заранее спасибо..
Ответ №1:
Похоже, вы, возможно, используете NSURLConnection
, и если это так, то, как отметил джошпол, по умолчанию он будет действовать асинхронно. То есть, когда вы запускаете соединение, NSURLConnection
объект создаст новый поток, выполнит свою работу в этом потоке и вернет вам результаты в исходном потоке с помощью методов делегирования, после чего очистит второй поток. Это означает, что исходный поток, основной или нет, не будет заблокирован, пока соединение выполняет свою работу. Все, что вам нужно сделать, это создать действие вашего таймера и запустить соединение.
В других случаях у вас есть несколько вариантов. Достаточно просто настроить метод timer, который будет вызывать другой метод для выполнения в фоновом режиме:
- (void)periodicMethodTimerFire:(NSTimer *)tim {
[self performSelectorInBackground:@selector(myPeriodicMethod:)
withObject:myPeriodicArgument];
}
Это может затруднить получение результатов из другого потока (потому что вам нужно передать ссылку на исходный поток в метод). Однако, поскольку вы, похоже, с самого начала находитесь в основном потоке, вы можете использовать performSelectorOnMainThread:withObject:waitUntilDone:
передачу NO
для wait
возврата аргумента.
Более сложный вариант — настроить свой собственный фоновый поток с запущенным в нем таймером, но я был бы удивлен, если бы это было действительно необходимо.
Ответ №2:
Если вы используете NSURLConnection, это асинхронно. Скорее всего, это подойдет для ваших нужд.