Я нахожусь в стадии разработки для приложения, которое будет использовать веб-службу REST и, как правило, имеет дилемму в отношении использования асинхронных и синхронных потоков. Вот сценарий.
Скажем, у вас есть три варианта, которые можно развернуть, каждый из которых имеет свой собственный ресурс на основе REST. Я могу либо лениво загружать каждый из них синхронным запросом, но блокирует пользовательский интерфейс и не позволяет пользователю удалять обратную навигационную кнопку во время получения данных. Этот случай применяется практически везде, кроме случаев, когда для вашего приложения требуется экран входа в систему. Я не вижу никакой причины использовать синхронные HTTP-запросы по сравнению с асинхронными из-за этой причины. Единственный раз, когда имеет смысл это сделать, чтобы рабочий поток выполнял ваш синхронный запрос и уведомлял основной поток, когда запрос выполнен. Это предотвратит блокировку. Тогда возникает вопрос: скамейка, маркирующая ваш код, и вид, у которого больше накладных расходов, потоковый синхронный запрос или асинхронный запрос.
Проблема с асинхронными запросами заключается в том, что вам нужно либо настроить интеллектуальную систему уведомлений, либо делегировать систему, поскольку у вас может быть несколько запросов на несколько ресурсов, происходящих в любой момент времени. Другая проблема с ними заключается в том, что если у меня есть класс, скажем, singleton, который обрабатывает все мои данные, я не могу использовать асинхронные запросы в методе getter. Значит, следующее не будет идти:
- (NSArray *)users {
if(users == nil)
users = do_async_request // NO GOOD
return users;
}
тогда как следующее:
- (NSArray *)users {
if(users == nil)
users == do_sync_request // OK.
return users;
}
У вас также может быть приоритет. То, что я подразумеваю под приоритетом, - если вы посмотрите приложение Apple Mail на iPhone, вы заметите, что они сначала высасывают все дерево POP/IMAP, прежде чем делать второй запрос на получение первых двух строк (по умолчанию) вашего сообщения.
Я полагаю, что мой вопрос для вас - эксперты. Когда вы используете асинхронные, синхронные, потоки - и когда вы используете либо асинхронную/синхронизацию в потоке? Какую систему делегаций вы настроили, чтобы знать, что делать, когда асинхронный запрос завершается? Вы оцениваете приоритеты своих асинхронных запросов?
Там есть множество решений для этой слишком распространенной проблемы. Это просто взломать что-то. Проблема в том, что я не хочу взломать, и я хочу иметь что-то простое и удобное в обслуживании.