Параллельная загрузка изображений для iOS - PullRequest
1 голос
/ 22 марта 2011

Я пишу приложение для чтения RSS для iOS.Там будет tableView со списком статей в ленте.Каждая ячейка этого tableView будет содержать изображение - миниатюру для статьи.Я хочу, чтобы он загружался наиболее эффективным способом:

  1. Самый высокий приоритет - для видимых миниатюр.
  2. Было бы хорошо, если бы видимые миниатюры могли загружаться в правильном порядке: сверху внизвнизу.
  3. Невидимые миниатюры тоже должны быть предварительно загружены.Но с самым низким приоритетом.
  4. Было бы неплохо, если бы порядок загрузки невидимых миниатюр был следующим: от ближайших (как сверху, так и снизу) до видимых ячеек до самых дальних.
  5. Каждый раз, когда tableView прокручивает, его ячейки должны обновлять свой приоритет загрузки в зависимости от их видимости и расстояния до видимой области.

Я немного застрял, какой подход использовать.Наиболее сложным является (5).Это необходимо, потому что приложение, вероятно, будет использоваться в условиях узкой полосы пропускания.Так что приложение должно сделать так, чтобы лучше было использовать низкую скорость соединения.

На данный момент у меня есть NSOperationQueue для загрузки изображения.maxConcurrentOperationCount равен 2. Загрузка NSOperations не является одновременной (в терминах Apple), т.е. выполняется в отдельных потоках.Каждая операция NSO - это просто синхронная инициализация NSData initWithContentsOfURL.Проблема с этим подходом заключается в том, что я не могу контролировать уже выполняющиеся операции загрузки.Событие не может отменить их!

Идеально было бы, если бы я мог изменить приоритет ВСЕХ (включая уже выполняющихся) операций загрузки в любое время.Поэтому я думаю о переходе на одновременные (в терминах Apple) операции NSO с асинхронной загрузкой NSURLConnection.Чтобы я мог отменить операцию, посмотрев на isCancelled prop между didReceiveData.Я планирую использовать эту отмену для операций, приоритет которых был понижен: сохранить данные, уже загруженные операцией, отменить их, добавить с новым (более низким) приоритетом в очередь и возобновить загрузку.Надеюсь, что параллельные (с точки зрения Apple) операции не замедляют работу пользовательского интерфейса, поскольку задачи загрузки не требуют интенсивной загрузки ЦП и, вероятно, будут иметь высокую задержку.

Также я не уверен, как расставить приоритеты в операциях.Так как NSOperationQueuePriority имеет только 5 возможных значений.Т.е. как сохранить порядок загрузки видимых (сверху вниз) и невидимых (от близких к дальним) миниатюр?

Прошу сообщить)

...