2013-08-01 2 views
0

мне кажется легким вопросом, но я не могу найти ответ нигде.Выполняется ли загрузка async http при появлении ViewController?

У меня есть контроллер вида, который загружает данные асинхронно, а затем сохраняет его при нажатии кнопки.

Могу ли я быть уверенным, что асинхронный запрос будет завершен (ViewController является делегатом), и данные будут сохранены даже при появлении ViewController? В противном случае я бы проверял, была ли загрузка завершена, когда она выскочила, и если не начать фоновый поток для загрузки данных.

Благодарим за помощь!

+0

Как вы делаете загрузку? NSURLConnection? – jsd

ответ

-1

Вы должны сделать все ваши загрузки данных в классе модели, а не контроллер (MVC).

Создайте Singleton NSObject, который содержит всю вашу логику для загрузки из Интернета и сохраняет его в пределах одного синглтона. Таким образом, любой класс в вашем приложении может получить доступ к этим данным, и вам не нужно беспокоиться о том, что viewControllers освобождаются, когда вы выталкиваете его из стека навигации.

Singleton пример:

+ (YourObject *)object 
{ 
    static YourObject *_object = nil; 
    static dispatch_once_t oncePredicate; 
    dispatch_once(&oncePredicate, ^{ 
     _object = [[self alloc] init]; 
    }); 

    return _object; 
} 
+0

Как сообщить ViewController, что данные были загружены? Я устанавливаю ViewController как делегат singleton? Сначала ViewController показывает изображение низкого качества, а в фоновом режиме загружается версия с более высоким разрешением. Итак, как я узнаю, когда это изображение доступно? – JWKothe

+0

@ProgrammingBonn Вы можете создать обратный вызов блока для singleton. Поэтому в вашем ViewController, который сообщает singleton о вызове API, вы можете передать ему блок (или делегат, если это более важно), который будет выполняться по завершении или вызовет делегата для уведомления. Вы также можете использовать NSNotifications для трансляции изменений из вашего синглтона во все приложение. – Eric

+0

Извините, что беспокоился о еще одном вопросе. Как только я скачал изображение в одноэлементном режиме, сохраните его в одноэлементном режиме или просто добавлю его в ImageView, а затем забудьте об этом. Сначала кажется более логичным, но второй вариант кажется более совершенным. Ценю вашу помощь! – JWKothe

0

Надеюсь, вы отделите запрос asynch от uiviewcontroller.

В противном случае убедитесь, что каждое действие в пользовательском интерфейсе будет инициировано на основной резьбе.

dispatch_async(dispatch_get_main_queue(), ^{ 

    //implement your code on UI 

}); 

если UIViewController связала делегат и контроллер все еще существует (не ноль), то метод исходит от делегата будет работать, даже если контроллер UIView пока не появится.

Приветствия

Смежные вопросы