2015-10-03 2 views
0

Использование Parse Я загружаю изображения, текст и т. Д. И использую их в ячейках таблицы. Однако, обновляясь (когда индикатор активируется в навигационной панели), я не могу прокручивать или перемещать приложение. Это похоже на то, что приложение перестает отвечать на запросы, пока просмотр таблицы не будет обновлен.UITableView не может прокручиваться при обновлении

Любая помощь очень ценится.

+1

Поскольку вы загружаете синхронно, что требует времени, и, таким образом, вы блокируете интерфейс. В реальной жизни процесс WatchDog убьет ваше приложение мертвым прямо перед глазами пользователя, если вы это сделаете. Провести исследования; этот вопрос во всем переполнении стека (а также решения). – matt

+0

Вы должны загрузить свои данные в фоновом потоке, если вы выполняете эти операции в основном потоке, вы блокируете пользовательский интерфейс. – flizana

ответ

0

Вот простой пример того, как отправить в другой поток, загрузить изображение и вернуться в основной поток при завершении загрузки.

func downloadImageAndUpdateUI(){ 
    imageView?.image = nil 

    if let imageUrl = aValidUrl{ 
     //get image on another thread 
     let qos = Int(QOS_CLASS_BACKGROUND.rawValue) 
     dispatch_async(dispatch_get_global_queue(qos, 0), { 
      let imageData = NSData(contentsOfURL: imageUrl) 
      //get back to main thread 
      dispatch_async(dispatch_get_main_queue(), { 
       if imageUrl == self.requestedImageUrl { //making sure if this image is still needed (or if user havent moved on to something else) 
        if imageData != nil{ 
         self.imageView.image = UIImage(data: imageData!) 
        } 
       } 
      }) 
     }) 
    } 
} 
2

Как и некоторые из уже высказанных комментариев, это связано с тем, что называется «блокировкой основного потока». См. this отличный учебник, чтобы узнать больше о параллелизме в Swift. Методы WithBlock или InBackground, которые вы вызываете в своем запросе Parse, должны вызывать его асинхронно. Если по какой-то причине у вас все еще есть проблема, вы должны вложить свой запрос Parse в блок dispatch_async. Here's полезный учебник о том, как это сделать.

Осторожно: Всегда сделать обновление пользовательского интерфейса на вашем нить. Плохие вещи произойдут, если вы этого не сделаете.

+0

Это работает, но, похоже, требуется очень много времени, чтобы загрузить что-либо при использовании findObjectsInBackgroundWithBlock. Должен ли я просто использовать код Swift? – exotue

+0

Если вы загружаете изображения, то вы правы, это займет некоторое время, потому что вы не обновляете представление таблицы каждый раз при загрузке нового изображения. В этом случае вы можете обойти это. Хотя он не реализует Parse, я узнал об этом видео, и я настоятельно рекомендую его: https://www.youtube.com/watch?v=gyluPwsPZ8c. Принципы будут одинаковыми. – rb612

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