2015-08-14 3 views
2

У меня есть UITableViewController, отображающий список аудиофайлов, при нажатии на аудиофайл я нажимаю другой UITableViewController, показывающий подробное представление аудиофайла. В этом представлении также есть кнопка «Загрузить» и представление UIProgressIndicator.Рекомендации по внедрению диспетчера загрузки iOS с представлением прогресса

У меня есть класс диспетчера загрузки (реализованный как Singleton), который заботится о загрузке файла. Его метод загрузки принимает блок, который вызывается с обновлениями о ходе загрузки. Я использую его для обновления представления UIProgressIndicator. Это работает отлично до того момента, когда вы покидаете контроллер подробного представления и возвращаетесь в более поздний момент времени, когда файл все еще загружается. Разумеется, ранее установленный блок прогресса все еще доступен, но его просмотр в UIProgressIndicator отсутствует, поэтому он больше не обновляется.

Мне интересно, если разумная идея просто повторно установить блок при повторном входе в контроллер подробных представлений (viewDidLoad) или если блок-подход не подходит для этого случая? Может быть, лучше использовать KVO?

Любые предложения?

Спасибо!

ответ

3

Блок-подход полезен, если срок службы загрузчика контролируется VC. Таким образом, когда VC освобождается, он освобождает загрузчик (загрузчик не будет одиночным). Если вы не рискуете создать захваченные объекты (VC), которые не могут быть выпущены, поскольку они указаны в вашем блоке, а ваш блок ссылается на «вечный» объект (singleton).

Поскольку срок службы VC потенциально короче, чем загрузчик, лучшим вариантом было бы использовать некоторые наблюдения на основе подписки на одно скачивание.

Таким образом, ваш VC подписывается в (например) viewWillAppear и отписывает в представленииWillDisappear (important).

Вы также можете использовать глобальное уведомление о прогрессе (через NSNotificationCenter), наблюдение за ключом или любые другие средства.

Важная часть заключается в том, что когда ваш VC отпущен, на нем не указывает ничто в загрузчике.

+1

Да, жизнь VC является самой важной частью. Я часто решал это через NSNotifications, отправляемый загрузчиком-кодом. Его исполнение и легко реализуется и дает слабо связанную систему. – Tobias

+0

Кроме того, если вы хотите использовать блоки KVO +, отметьте Block-KVO https://github.com/iMartinKiss/Block-KVO –

+0

Спасибо за понимание! Я пошел с подходом KVO, и он сделал код намного проще для понимания и меньше подвержен ошибкам ... как только я понял, что observValueForKeyPath не обязательно выполняется в основном потоке, и мне пришлось бросать dispatch_async, чтобы избежать сбоев, когда обновление индикатора индикатора прогресса. –