将图像从解析加载到集合视图 Swift

Posted

技术标签:

【中文标题】将图像从解析加载到集合视图 Swift【英文标题】:Load Image from parse to Collection View Swift 【发布时间】:2017-04-23 11:22:32 【问题描述】:

我想获得一些如何解决问题的建议。我想将存储在 Parse Server 上的图像加载到我的集合视图中,我正在使用以下代码:

import UIKit
import Parse

class ViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate 

    //var my_array:[String] = []
    //var my_array: [String] = [String]()
    var imageResources : Array<UIImage> = []
    //var query = PFQuery(className: "User")
    var query2 = PFQuery(className: "User")

    override func viewDidLoad() 
        super.viewDidLoad()

        // Do any additional setup after loading the view, typically from a nib.

        //my_array = ["montagne.jpeg","montagne.jpeg","montagne.jpeg","montagne.jpeg","montagne.jpeg","montagne.jpeg","montagne.jpeg","montagne.jpeg","montagne.jpeg","montagne.jpeg","montagne.jpeg","montagne.jpeg","montagne.jpeg","montagne.jpeg"]

        query2.findObjectsInBackground (objects: [PFObject]?, error: Error?) -> Void in
            if error == nil 
                print("OK")

                for object in objects! 
                    print("IN FOR")
                    let thumbNail = object["image"] as! PFFile
                    thumbNail.getDataInBackground(
                        (imageData: Data?, error: Error?) -> Void in
                        if (error == nil) 
                            print("IN SECOND IF")
                            let image = UIImage(data:imageData!)
                            self.imageResources.append(image!)
                            //let size = self.imageResources.count
                            //print(size)
                        
                    )
                
            
        

        //query.findObjectsInBackground (objects: [PFObject]?, error: Error?) -> Void in
          //  if error == nil 
          //          for object in objects! 
          //              self.my_array.append(object.object(forKey: "image") as! String)

                  //  
           // 
        



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

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 
        return imageResources.count
    

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 
        var cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! CollectionViewCell
        cell.ImageView?.image = imageResources[indexPath.row]
        return cell

    

我在运行我的应用程序时没有任何错误,但是我没有在集合视图中获取我的应用程序上的图像。图片在我的 Parse Server 中:Parser Server Interface

我刚刚发现在这段代码中,打印 print("IN FOR") 没有打印,所以我认为这里有问题,这就是为什么我的应用程序没有加载任何内容:

query2.findObjectsInBackground (objects: [PFObject]?, error: Error?) -> Void in
            if error == nil 
                print("OK")

                for object in objects! 
                    print("IN FOR")
                    let thumbNail = object["image"] as! PFFile
                    thumbNail.getDataInBackground(
                        (imageData: Data?, error: Error?) -> Void in
                        if (error == nil) 
                            print("IN SECOND IF")
                            let image = UIImage(data:imageData!)
                            self.imageResources.append(image!)
                            //let size = self.imageResources.count
                            //print(size)
                        
                    )
                

但是当我在我的程序中使用修复图像并将其存储在一个数组中(注释中的代码)时,我可以在我的集合视图中看到这些图像...... 有人可以帮我解决这个问题吗?谢谢一百万。

乔迪。

【问题讨论】:

尝试在数据到来后重新加载集合视图,尝试为您的集合视图获取出口并在 for 循环之后执行 collectionview.realodData()。 是的,这发生在我身上,尝试清理项目,或者写@IBOutlet var outletOfCollectionView: UICollectionView!然后用集合视图控件附加它 嘿,谢谢你的回答,我得到了同样的东西,我认为这就像循环有问题,因为它没有进入 for 循环......当我想打印时( print("IN FOR")) 它没有出现在控制台中.. print("OK") 出现? 是的 print("OK") 出现,但其余部分没有出现,就像它没有进入一样:( 【参考方案1】:

User 类是 Parse 的内置类,内部命名为 _User(带下划线),因此您的查询应如下所示:

var query2 = PFQuery(className: "_User")

或者,更紧凑:

var query2 = PFUser.query()

编辑

获取用户及其图像后,您必须重新加载集合视图以使其了解新数据;并且由于发生这种情况时您在后台队列中,因此您必须分派到主队列才能这样做:

for object in objects! 
  // ...

DispatchQueue.main.async 
  self.collectionView.reloadData()
    

然而,我在您的代码中没有看到UICollectionView;您只实现委托和数据源协议。你最好只继承UICollectionViewController 而不是UIViewController

【讨论】:

谢谢,我的 for 循环现在可以工作,但它不显示图像,我必须在用户类名中指定列的名称吗?因为我认为我在这里这样做:让 thumbNail = object["image"] as! PF文件 还可以考虑使用 ParseUI 来使用 PFImageViews 内置 pffile 图像下载 + 占位符图像支持,这可能会使事情变得更容易。

以上是关于将图像从解析加载到集合视图 Swift的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Swift 3 将图像从 Rest Api 加载到视图中加载方法

如何从 HTTP 请求将图像加载到 UIButton Swift

Swift - 从解析接收图像并显示它们的问题

如何从HTTP请求将图像加载到UIButton Swift中

如何在swift ios的集合视图中动态加载url(以图像形式)?

Swift - 以编程方式从集合视图中选择第一个项目