Поскольку другие пользователи ответили на два ваших вопроса, я хотел бы прокомментировать ваш код и рекомендовать вам не использовать GCD для сетевых запросов, таких как изображения. Основная проблема с ними заключается в том, что все они будут работать одновременно. В зависимости от количества загрузок, вы можете создать слишком много одновременных подключений, которые могут затормозить сотовую связь, и пользователь может в конечном итоге думать, что что-то не так, если изображения не начинают появляться, когда они борются за драгоценное сеть.
Попробуйте использовать NSOperationQueue
со значением maxConcurrentOperationCount
, равным 2 или 3. Это позволит вам ставить в очередь потенциально бесконечное количество сетевых запросов, но не более нескольких из них будут работать параллельно. Поскольку вы можете получить доступ к сетевому состоянию устройства, вы можете условно увеличить его, например, до 8 для подключений Wi-Fi.
И вторая проблема, связанная с GCD, заключается в том, что отменить ожидающие операции немного громоздко. Если ваш пользователь входит в контроллер представления и затем отодвигается назад, в зависимости от того, как вы запрограммировали свой код, блоки GCD сохранят контроллер представления, предотвратят его отпускание, и фактически все сетевые операции должны будут завершиться, пока контроллер не будет освобожден (поэтому нет смысла отменять соединения в dealloc
).
Я научился этому нелегко, отслеживая прокси и быстро переходя в представление и обратно. Было действительно ужасно видеть, как незавершенные соединения нанесли около 20 секунд дополнительного повреждения пропускной способности сети моему в противном случае незнакомому приложению.
tl; dr использовать очередь для сети, GCD для обработки изображений / масштабирования / обновления графического интерфейса.