Я нахожусь в стадии разработки для приложения, которое будет использовать веб-сервис REST и, в некотором роде, сталкивается с дилеммой в том, что касается использования асинхронного и синхронного потоков, а также потоков. Вот сценарий.
Допустим, у вас есть три варианта, каждый из которых имеет собственный ресурс на основе REST. Я могу либо лениво загрузить каждый из них с синхронным запросом, но это заблокирует пользовательский интерфейс и не даст пользователю нажать кнопку обратной навигации, пока данные извлекаются. Этот случай применяется почти везде , за исключением , когда вашему приложению требуется экран входа. Я не вижу никакой причины использовать синхронные HTTP-запросы против асинхронных по одной только этой причине. Единственный раз, когда это имеет смысл, - это чтобы рабочий поток сделал ваш синхронный запрос и уведомил основной поток о завершении запроса. Это предотвратит блокировку. Тогда вопрос заключается в том, чтобы разметить ваш код и увидеть, у кого больше накладных расходов, многопоточный синхронный запрос или асинхронный запрос.
Проблема с асинхронными запросами заключается в том, что вам нужно либо настроить интеллектуальное уведомление, либо делегировать систему, так как вы можете иметь несколько запросов на несколько ресурсов в любой момент времени. Другая проблема с ними заключается в том, что если у меня есть класс, скажем, синглтон, который обрабатывает все мои данные, я не могу использовать асинхронные запросы в методе получения. Это означает, что следующее не пойдет:
- (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, а затем делают второй запрос на получение первых двух строк (по умолчанию) вашего сообщения.
Полагаю, мой вопрос к вам, эксперты, таков. Когда вы используете асинхронные, синхронные потоки - и когда вы используете либо асинхронную / синхронизацию в потоке? Какую систему делегирования вы настроили, чтобы знать, что делать после завершения асинхронного запроса? Вы устанавливаете приоритеты ваших асинхронных запросов?
Существует множество решений этой слишком распространенной проблемы. Просто взломать что-нибудь. Проблема в том, что я не хочу взламывать и хочу иметь что-то простое и легкое в обслуживании.