2015-11-16 2 views
0

Я пытаюсь загрузить изображение с Parse.com в uiimageview внутри моей раскадровки.Извлечь изображение в UiimageView из Parse (Swift)

Я загрузил изображение в Parse. В идеале это вызовет мой образ по идентификатору, а затем продолжит отображение его внутри uiimageView. Я искал высокий и низкий для ответа, но большинство из них либо для Obj-C, либо только для половины кода для вызова изображения.

Я собираюсь отображать изображение, которое я могу обновлять ежедневно.

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

override func viewDidLoad() { 
    super.viewDidLoad() 

      //Print out a message if we're able to get to this part of the program. 
    print("Reached getProductData function. Now asking for data.") 
    getProductData() 
    print("done"); 



} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

func getProductData() //-> UIImage 
{ 
    let query: PFQuery = PFQuery(className: "UserPhoto") 
    var gridimage = UIImage() 
    print("pass"); 
    //call function to get the data from parse by specifyng an objectId 
    query.getObjectInBackgroundWithId("XXXXXXXXXX") { 
     (productData:PFObject?, error:NSError?) -> Void in 
     if error == nil && productData != nil { 
      //Extract values from the productData PFObject and store them in constants 
      //-----start image loading 
      print("ok") 
      if let productImageFile = productData!["productImage"] as? PFFile { 
       productImageFile.getDataInBackgroundWithBlock {(imageData: NSData?, error: NSError?) -> Void in 
        if error == nil { 
         //here I changed var gridimage to just gridimage 
         gridimage = UIImage(data:imageData!)! 
         self.eliegrid.image = UIImage(data:imageData!) 
         print("next") 


        } 
        else 
        { 
         print("error") 
        } 
       } 
      } 

      //-----end image loading 

     } else if error != nil { 
      print("Could not load data from Parse") 

     } 


    } 
    //return gridimage 
} 

}

Похоже, что это пропускает этот блок:

if let productImageFile = productData!["productImage"] as? PFFile { 

EDIT: Потому что никогда не печатает "следующий".

Я также проверил

iOS - Retrieve and display an image from Parse in UIImageView (Swift 1.2 Error)

Но она по-прежнему не работает.

Я действительно новичок как в Parse, так и в Swift, и, возможно, мне не хватает чего-то простого. Любая помощь будет оценена!

UPDATE:

Благодаря @beyowulf! Вот рабочий код:

func getProductData() 
{ 
    let query: PFQuery = PFQuery(className: "UserPhoto") 
    var gridimage = UIImage() 
    print("pass"); 
    //call function to get the data from parse by specifyng an objectId 
    query.getObjectInBackgroundWithId("cF0h6RVcKu") { 
     (productData:PFObject?, error:NSError?) -> Void in 
     if error == nil && productData != nil { 
      //Extract values from the productData PFObject and store them in constants 
      //-----start image loading 
      print("ok") 
      print(productData) 
      if let productImageFile = productData!["imageFile"] as? PFFile { 
       productImageFile.getDataInBackgroundWithBlock {(imageData: NSData?, error: NSError?) -> Void in 
        print("error") 
        if error == nil { 
         //here I changed var gridimage to just gridimage 
         gridimage = UIImage(data:imageData!)! 
         self.eliegrid.image = UIImage(data:imageData!) 
         print("next") 



        } 
       } 
      } 


        } 
        else 
        { 
         print("error") 
        } 
       } 
      } 

}

+0

Вы уверены, что у вас есть изображение грамматического разбора? Вы можете проверить на parse.com? – Hassan

+0

Да, у меня есть изображение на Parse.com. Я проверил и дважды проверил на моем бэкэнде онлайн. –

ответ

-1

Move:

func getProductData() -> UIImage 
    { 
     var gridimage = UIImage() 
     print("pass"); 
     //call function to get the data from parse by specifyng an objectId 
     query.getObjectInBackgroundWithId("XXXXXXXXXX") { 
      (productData:PFObject?, error:NSError?) -> Void in 
      if error == nil && productData != nil { 
       //Extract values from the productData PFObject and store them in constants 
       //-----start image loading 
       print("ok") 
       //var imageFromParse = object?.objectForKey("imageNews") as? PFFile 
       //imageFromParse!.getDataInBackgroundWithBlock({ (imageData: NSData?, error: NSError?) -> Void in 
        //var image: UIImage! = UIImage(data: imageData!)! 
        //cell?.imageViewCell?.image = image 
       //}) 
       if let productImageFile = productData!["productImage"] as? PFFile { 
       productImageFile.getDataInBackgroundWithBlock {(imageData: NSData?, error: NSError?) -> Void in 
         if error == nil { 
          var gridimage = UIImage(data:imageData!)! 
          self.eliegrid.image = UIImage(data:imageData!) 
          print("next") 


         } 
        } 
       } 



      } else if error != nil { 
       print("Could not load data from Parse") 

      } 


     } 
    return gridimage 
    } 

из viewDidLoad затем удалить:

print("done"); 
    self.eliegrid.image = getProductData() 

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

Также попробуйте изменить:

if let productImageFile = productData!["productImage"] as? PFFile { 
       productImageFile.getDataInBackgroundWithBlock {(imageData: NSData?, error: NSError?) -> Void in 
         if error == nil { 
          var gridimage = UIImage(data:imageData!)! 
          self.eliegrid.image = UIImage(data:imageData!) 
          print("next") 


         } 
        } 
       } 

To:

   let productImageFile = productData.valueForKey("productImage") as! PFFile 
       productImageFile.getDataInBackgroundWithBlock {(imageData: NSData?, error: NSError?) -> Void in 
         if error == nil { 
          var gridimage = UIImage(data:imageData!)! 
          self.eliegrid.image = UIImage(data:imageData!) 
          print("next") 


         } 
        } 
+0

Спасибо за быстрый ответ. Куда бы я переместил весь код? –

+0

Под «}» для конца viewDidLoad. Это просто должна быть его собственная функция, не вложенная в другую. – beyowulf

+0

Хорошо. Я попробовал то, что вы предложили, но он все еще не появляется внутри uiimageview. Проверьте мой оригинальный вопрос на отредактированный код! –