从 Parse (Swift) 中检索图像到 imageView

Posted

技术标签:

【中文标题】从 Parse (Swift) 中检索图像到 imageView【英文标题】:Retrive an image into UiimageView from Parse (Swift) 【发布时间】:2015-11-16 01:12:39 【问题描述】:

我一直在尝试将 Parse.com 中的图像加载到故事板内的 uiimageview 中。

我将图像上传到 Parse。理想情况下,它会通过 ID 调用我的图像,然后继续在 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 

编辑:因为它从不打印“下一个”。

我也看过了

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

但还是不行。

我对 Parse 和 Swift 都很陌生,我可能会遗漏一些简单的东西。任何帮助将不胜感激!

更新:

感谢@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")
                    
                
            

【问题讨论】:

你确定你在 Parse 上有一张图片吗?你能检查一下 parse.com 吗? 是的,我在 Parse.com 上有一张图片。我已经在线检查并仔细检查了我的后端。 【参考方案1】:

移动:

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
    

out of 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")


                        
                    
                

收件人:

                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")


                        
                    

【讨论】:

感谢您的快速回复。我会将所有代码移到哪里? viewDidLoad 结束的“”下方。它只需要是它自己的函数,而不是嵌套在另一个函数中。 好的。我尝试了你们提供的内容,但它仍然没有出现在 uiimageview 中。检查我的原始问题以获取已编辑的代码! 打印什么?它打印“通过”吗? “行”? “下一个”? 它打印:“达到 getProductData 功能。现在要求数据。通过完成确定”有什么想法吗?

以上是关于从 Parse (Swift) 中检索图像到 imageView的主要内容,如果未能解决你的问题,请参考以下文章

使用 Swift 从 Parse 中检索图像

Swift 无法从 parse.com 检索图像

从 Parse.com (Swift) 检索数据

Swift 3 上传图片到 Parse Server

Swift 2.0:需要在 Parse 的 PFQueryTableViewController 上显示图像(PFFile)?

从 Parse 在 Swift 中加载图像