Основные данные, загрузка файлов и безопасность потоков - PullRequest
2 голосов
/ 11 октября 2009

Какой предпочтительный подход для постоянного обмена данными между потоками при использовании Core Data? Я загружаю большой файл и хочу показать ход загрузки в UIProgressBar. Фактическая загрузка происходит в фоновом потоке, созданном NSOperation.

Информация о загрузке (локальный путь, общее количество байтов, полученных байтов) моделируется как управляемый объект Core Data, а фактический файл хранится в каталоге Documents /. Мне пришло в голову одно решение - создать отдельный контекст управляемого объекта в фоновом потоке, передать ему objectID и вытащить его с помощью метода objectWithID:. Всякий раз, когда фоновый поток выполняет сохранение, основной поток получает уведомление, а основной контекст объединяет эти изменения, и представление таблицы впоследствии обновляется.

Этот подход работает, но сохранение не может быть выполнено слишком часто, или пользовательский интерфейс зависает. Таким образом, пользовательский интерфейс обновляется после получения каждого X KB данных, где значение X должно составлять не менее 500 КБ, чтобы пользовательский интерфейс был несколько отзывчивым. Есть ли лучший способ передачи данных о ходе загрузки в основной поток по мере их поступления?

РЕДАКТИРОВАТЬ: будет ли использование KVO какой-либо помощи? Если да, знаете ли вы какие-нибудь хорошие учебники по теме?

Ответы [ 2 ]

4 голосов
/ 11 октября 2009

Я знаю, что вы уже создали свою собственную систему, но я использую ASIHTTPRequest для всех моих сетевых операций. Он очень надежный и имеет массу полезных функций, таких как возобновление файлов, сохранение непосредственно на диск, мониторинг хода загрузки, мониторинг хода загрузки и кухонная раковина. Если вы его не используете, вы можете посмотреть на источник, чтобы увидеть, как они это делают, потому что пользовательский интерфейс никогда не зависает, когда я использую отчеты о ходе работы в этой среде.

0 голосов
/ 12 октября 2009

Несмотря на то, что я собираюсь использовать ASIHTTPRequest для своего проекта, все же хорошо упомянуть мое решение проблемы для полноты. Это очевидно, но сохранение контекста данных ядра каждые несколько секунд - ужасная ошибка.

Вместо этого я добавил делегата прогресса в операцию загрузки, которая получает уведомление об обновлении в главном потоке.

NSNumber bytesDownloaded = [NSNumber numberWithLongLong:[data length]];
[downloadDelegate performSelectorOnMainThread:@selector(updateProgress:) withObject:bytesDownloaded waitUntilDone:NO];

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...