2014-12-27 4 views
4

В моем ProfileViewController У меня есть запрос, который извлекает изображение профиля пользователя, которое хранится в виде файла PF.На главном потоке выполняется длительная работа. Swift

var query = PFQuery(className:"Users") 
    query.whereKeyExists("profilePicture") 
    query.findObjectsInBackgroundWithBlock { 
     (objects: [AnyObject]!, error: NSError!) -> Void in 
     if error == nil { 

      self.userNameLabel.text = PFUser.currentUser().username 

      if let imageFile = PFUser.currentUser().objectForKey("profilePicture") as? PFFile { 
       if let data = imageFile.getData() { 
        self.profPic.image = UIImage(data: data) 
       } 
      } 

     } 
     else { 
      println("User has not profile picture") 
     } 
    } 

Это единственный запрос в этой точке зрения, у меня есть еще один запрос в моей домашней странице моего приложения, который имеет все сообщения всех пользователей. Ошибка, которую я получаю i s A long-running operation is being executed on the main thread.Break on warnBlockingOperationOnMainThread() to debug.

Я не знаю, как обойти это, особенно, поскольку мне нужно сделать еще один запрос, чтобы получить текущую публикацию пользователей для профиля. Должен ли я использовать что-то другое, кроме findObjectsInBackgroundWithBlock. Благодарю.

+0

Вы абсолютно уверены, что это источник неполадки? Нет '... WithContentsOfURL' или' sendSynchronousRequest' задерживается? Ничто другое, что могло бы блокировать основной поток? BTW, Instruments имеет функцию «Запись ожидающих потоков», чтобы помочь выявить эти проблемы. Вы использовали это? – Rob

+0

Я не использовал ни WithContentsOfUrl, ни sendSynchronousRequest, можете ли вы объяснить эту функцию «Инструменты», чтобы я мог ее использовать. @Rob – kareem

+0

См. Раздел «Профилирование времени» в приложении WWDC 2014 [Улучшение вашего приложения с помощью инструментов] (https://developer.apple .com/videos/wwdc/2014 /? id = 418), около 18 минут в видео. Это было рассмотрено и в других годовых видео, но это хорошее место для начала. Но danh определил источник проблемы, поэтому инструменты, вероятно, сейчас не нужны. Но в следующий раз вы можете использовать инструменты, чтобы самостоятельно найти источник проблемы. – Rob

ответ

5

Предупреждение из Parse sdk. Эта часть: imageFile.getData() является синхронной, и Parse достаточно любезен, чтобы предупредить вас при использовании любого из блокирующих вызовов. Есть несколько разновидностей getDataInBackground ... доступных в качестве альтернатив. See them in the docs here.

+0

Спасибо, какой метод вы бы порекомендовали? Поэтому я не должен использовать findObjectsWithBlock? @danh – kareem

+0

getDataInBackground может работать. Следующий сорт ... WithBlock: сообщает вам, когда это делается. Другой ... WithBlock: ProgressBlock: сообщает вам, когда это делается, и% завершено, когда вы идете. (но помните, что это класс PFFile, поэтому не находите объекты, а получайте данные). – danh

3

Чтобы разработать решение @danh, это обновленный исходный код и работает отлично, спасибо @danh!

override func viewDidLoad() { 
    super.viewDidLoad() 


    var query = PFQuery(className:"Users") 
    query.whereKeyExists("profilePicture") 
    query.findObjectsInBackgroundWithBlock { 
     (objects: [AnyObject]!, error: NSError!) -> Void in 
     if error == nil { 

      self.userNameLabel.text = PFUser.currentUser().username 

      if let imageFile = PFUser.currentUser().objectForKey("profilePicture") as? PFFile { 
      imageFile.getDataInBackgroundWithBlock { (data: NSData!, error: NSError!) -> Void in 
        self.profPic.image = UIImage(data: data) 
       } 
      } 

     } 
     else { 
      println("User has not profile picture") 
     } 
     } 
    } 
Смежные вопросы