从指针接收图像

时间:2015-08-05 06:45:42

标签: ios swift pointers parse-platform

我的解析中有一个指针。指针告诉我谁上传了图像。我正在尝试检索上传者的用户名和个人资料图片。为此,我放了query.includeKey("uploader")。用户通过用户类进行管理。和帖子在帖子类中管理。要检索图像和名称,我有以下代码。

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {

    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("newview", forIndexPath: indexPath) as! NewCollectionViewCell
    let item = self.votes[indexPath.row]





    // Display "initial" flag image
    var initialThumbnail = UIImage(named: "question")
    cell.postsImageView.image = initialThumbnail

    if let pointer = item["uploader"] as? PFObject {
        cell.userName!.text = item["username"] as? String

    }

    if let profile = item["uploader"] as? PFObject {

    cell.profileImageView.loadInBackground({ (image:UIImage, error:NSError) -> Void in
        if error != nil{
            cell.profileImageView.image = image
        }
    })}

    if let votesValue = item["votes"] as? Int
    {
        cell.votesLabel?.text = "\(votesValue)"
    }

    // Fetch final flag image - if it exists
    if let value = item["imageFile"] as? PFFile {

        cell.postsImageView.file = value
        cell.postsImageView.loadInBackground({ (image: UIImage?, error: NSError?) -> Void in
            if error != nil {
                cell.postsImageView.image = image
            }
        })
    }

    return cell
}

但是发生错误的说法是无法使用类型(UIImage,NSError)的参数列表调用loadinbackround - > void。奇怪的是,错误仅适用于我尝试为用户检索图像的第一部分。我真的陷入了困境并希望得到帮助。我的指针检错了吗?谢谢。

更新2

@IBOutlet weak var collectionView: UICollectionView!

override func viewDidLoad() {
    super.viewDidLoad()



    let query = PFQuery(className: "Posts")
    query.includeKey("pointName")
    query.findObjectsInBackgroundWithBlock{(question:[AnyObject]?,error:NSError?) -> Void in

        if error == nil
        {
            if let allQuestion = question as? [PFObject]
            {
                self.votes = allQuestion
                self.collectionView.reloadData()
            }
        }
    }


    // Wire up search bar delegate so that we can react to button selections

    // Resize size of collection view items in grid so that we achieve 3 boxes across

    loadCollectionViewData()
}

/*
==========================================================================================
Ensure data within the collection view is updated when ever it is displayed
==========================================================================================
*/

// Load data into the collectionView when the view appears
override func viewDidAppear(animated: Bool) {
    loadCollectionViewData()
}

/*
==========================================================================================
Fetch data from the Parse platform
==========================================================================================
*/

func loadCollectionViewData() {
    // Build a parse query object
}

/*
==========================================================================================
UICollectionView protocol required methods
==========================================================================================
*/

func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
    return 1
}

func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return self.votes.count
}



func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {

    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("newview", forIndexPath: indexPath) as! NewCollectionViewCell
    let item = self.votes[indexPath.row]





    // Display "initial" flag image
    var initialThumbnail = UIImage(named: "question")
    cell.postsImageView.image = initialThumbnail

    if let pointer = item["uploader"] as? PFObject {
        cell.userName!.text = item["username"] as? String
        print("username")

    }

    if let profile = item["uploader"] as? PFObject,
        profileImageFile = profile["profilePicture"] as? PFFile {
            cell.profileImageView.file = profileImageFile
            cell.profileImageView.loadInBackground { image, error in
                if error == nil {
                    cell.profileImageView.image = image
                }
            }
    }

    if let votesValue = item["votes"] as? Int
    {
        cell.votesLabel?.text = "\(votesValue)"
    }

    // Fetch final flag image - if it exists
    if let value = item["imageFile"] as? PFFile {
        println("Value \(value)") 
        cell.postsImageView.file = value
        cell.postsImageView.loadInBackground({ (image: UIImage?, error: NSError?) -> Void in
            if error != nil {
                cell.postsImageView.image = image
            }
        })
    }

    return cell
}

在我的帖子课中,它就像这样enter image description here 用户在用户类中进行管理。我想获取发布图片的人的个人资料图片和用户名。 在用户类中,我拥有所有用户信息。 enter image description here

3 个答案:

答案 0 :(得分:0)

尝试使用以下内容替换您的loadInBackground方法:

cell.postsImageView.loadInBackground({ (image: UIImage!, error: NSError!) -> Void in
        if error == nil {
            cell.postsImageView.file = value
            cell.postsImageView.image = image
        }
    })
}

答案 1 :(得分:0)

cell.postsImageView.loadInBackground({
        (image: UIImage!, error: NSError!) -> Void in
        if error == nil {
if image != nil {
dispatch_async(dispatch_get_main_queue(),{
                cell.postsImageView.image = image
})
}else{
           println("Image not available")
        }

        }else{
           println(Image Downloading error: \(error))
        }
    })

试试这个,我想这会对你有所帮助:)。

答案 2 :(得分:0)

这里有两个问题,第一个是将闭包传递给loadInBackground方法的方法

编译器错误是因为您尝试使用非可选的闭包参数调用该方法。 在cell.postsImageView.loadInBackground电话中,您使用选项,而在cell.profileImageView.loadInBackground则不使用。{1}}。 闭包参数类型很重要,这就是编译器抱怨的原因。

我建议跳过类型并定义闭包,如下所示:

cell.profileImageView.loadInBackground { image, error in
    if error != nil{
        cell.profileImageView.image = image
    }
})}

另一个也许你的主要问题是你没有为个人资料设置文件。因此,如果我们说配置文件图像存储在上传器对象的imageFile下,您可以使用:

if let profile = item["uploader"] as? PFObject,
    profileImageFile = profile["imageFile"] as? PFFile {
        cell.profileImageView.file = profileImageFile
        cell.profileImageView.loadInBackground { image, error in
            if error == nil {
                cell.profileImageView.image = image
            }
        }
}

尽管如Parse文档所述,该方法会下载并显示图像:

  

下载完成后,将显示远程图像。

https://parse.com/docs/ios/api/Classes/PFImageView.html#//api/name/loadInBackground

如果您不需要任何特殊的错误处理,并且已经有占位符图像,请尝试加载图像:

if let profile = item["uploader"] as? PFObject,
    profileImageFile = profile["imageFile"] as? PFFile {
        cell.profileImageView.file = profileImageFile
        cell.profileImageView.loadInBackground()
}