Как сделать -sendSynchronousRequest быстрее?
В моем приложении я выполняю несколько разных методов, все в разных потоках, которые загружают данные из запросов, анализируют их и добавляют в массив. Большинство из этих методов загружают данные из одного запроса, но в методах используется for
цикл и скачивает более 30 переводов.
Но это создает плохой пользовательский опыт, пользователь должен наблюдать за вращающимся колесом и читать какой-то глупо сгенерированный случайный текст.
Так что я хочу знать, как я могу сделать синхронные запросы (NSURLConnection
) быстрее, какая техника лучше? Должен ли я немедленно переключиться на асинхронный, так как я делаю так много запросов? Что асинхронный вообще означает / делает, поможет ли это в этом сценарии?
Чтобы закончить все, приложение может занять до 7 секунд по Wi-Fi и медленнее 30 секунд по 3G (в Сингапуре, однако, с наихудшей пропускной способностью!)
Итак, как улучшить? Любые методы, приемы, API, пожалуйста, помогите!
Спасибо!
2 ответа
Скорость никак не будет зависеть от использования синхронного или асинхронного. Скорость интернета одинакова в любом случае.
Проблема в том, что вы НИКОГДА не должны делать синхронные сетевые вызовы в главном потоке. Это блокирует пользовательский интерфейс. В лучшем случае ваше приложение выглядит заблокированным для пользователя (плохо). В худшем случае, ОС убивает ваше приложение за то, что оно не отвечает (плохо).
Все сети должны быть сделаны в фоновом режиме.
Если ваше приложение не может продолжить работу до тех пор, пока не будет завершен весь доступ к сети, по крайней мере, вы можете открыть экран "занят", сообщающий пользователю, что происходит. Возможно, используйте индикатор выполнения, чтобы сообщить пользователю, как далеко продвинулся процесс, или отобразите счетчик "x of y" для количества файлов. Что когда-либо подходит для вашего приложения.
Но опять же, скорость доступа к сети не изменится. Вы будете предоставлять лучший пользовательский опыт.
Здесь много вопросов о том, как выполнять загрузку асинхронных файлов. Многие используют NSURLConnection
и другие используют сторонние библиотеки, которые могут облегчить работу в зависимости от того, что вы делаете. Немного поищем. Некоторые из них перечислены как связанные с этим вопросы.
Лучший способ исправить это - использовать асинхронные вызовы. Помимо скорости, вы должны избегать использования синхронных запросов, когда это возможно. В основном, если вы используете синхронный, но в отдельном потоке, вы делаете работу, которая уже сделана с асинхронным. Настройка будет более сложной, но вы можете отправлять все синхронные запросы одновременно, и они могут завершаться в разное время. Существует ограничение на количество запросов http, которые могут отправляться одновременно, но iOS ограничит это для вас, и вы все равно должны увидеть значительное улучшение производительности.