2016-01-24 2 views
1

Я новичок в Swift. Мой вопрос: я не уверен, как развернуть необязательное значение. Когда я печатаю object.objectForKey («profile_picture»), я могу видеть Optional(<PFFile: 0x7fb3fd8344d0>).Неустранимая ошибка: неожиданно найден нуль при развертывании необязательного значения. Swift

let userQuery = PFUser.query() 
    //first_name is unique in Parse. So, I expect there is only 1 object I can find. 
    userQuery?.whereKey("first_name", equalTo: currentUser) 
    userQuery?.findObjectsInBackgroundWithBlock({ (objects: [PFObject]?, error: NSError?) -> Void in 
     if error != nil { 
     } 
     for object in objects! { 
      if object.objectForKey("profile_picture") != nil { 
       print(object.objectForKey("profile_picture")) 
       self.userProfilePicture.image = UIImage(data: object.objectForKey("profile_pricture")! as! NSData) 
      } 
     } 
    }) 

ответ

1

Вы бы использовать if let для выполнения «факультативный связывания», только выполняя блок, если результат в вопросе не nil (и связывание переменной profilePicture в развернутом значение в процессе).

Было бы что-то вроде:

userQuery?.findObjectsInBackgroundWithBlock { objects, error in 
    guard error == nil && objects != nil else { 
     print(error) 
     return 
    } 
    for object in objects! { 
     if let profilePicture = object.objectForKey("profile_picture") as? PFFile { 
      print(profilePicture) 
      do { 
       let data = try profilePicture.getData() 
       self.userProfilePicture.image = UIImage(data: data) 
      } catch let imageDataError { 
       print(imageDataError) 
      } 
     } 
    } 
} 

Или, если вы хотите получить данные асинхронно, возможно:

userQuery?.findObjectsInBackgroundWithBlock { objects, error in 
    guard error == nil && objects != nil else { 
     print(error) 
     return 
    } 
    for object in objects! { 
     if let profilePicture = object.objectForKey("profile_picture") as? PFFile { 
      profilePicture.getDataInBackgroundWithBlock { data, error in 
       guard data != nil && error == nil else { 
        print(error) 
        return 
       } 
       self.userProfilePicture.image = UIImage(data: data!) 
      } 
     } 
    } 
} 

Было бы что-то вдоль этих линий, используя if let разворачивать, что по желанию , И тогда вы должны получить связанный с этим NSData объект PFFile (из метода getData или getDataInBackgroundWithBlock, предположительно).

См. Optional Binding обсуждение в Быстрый язык программирования.

+0

Это работает. Не могли бы вы объяснить, что такое «если да»? –

+0

'if let' является« необязательной привязкой », т. Е. Выполняется только выполнение блока, если результат не является' nil' (и привязывает переменную 'profilePicture' к развернутому значение в этом процессе). Очевидно, что если объект был «nil», он просто проскользнул бы через блок «if let». См. [Дополнительное связывание] (https://developer.apple.com/library/ios/documentation/ Swift/Conceptual/Swift_Programming_Language/TheBasics.html # // apple_ref/doc/uid/TP40014097-CH5-ID333) в языке Swift Programming._ – Rob

+0

ОК. Получил. Спасибо :) –