ios - 解析查询,图像数组返回空

标签 ios swift parse-platform

我正在尝试查询我的 _User 类以获得特定的 objectId,并从中下载图像。

如果对照 parse.com 用户表进行检查,则通过 userList 传递的 objectId 是正确的。

返回的数组总是空的

如有任何帮助,我们将不胜感激。

func imageArrayFromUserList(userList: [PFUser]) -> [UIImage] {
    var arrayToReturn: [UIImage] = []
    for user in userList {
        let objectID = user.objectId

        let query = PFUser.query()
        //let query = PFQuery(className: "_User")
        query!.whereKey("objectId", equalTo: objectID!)
        //query?.limit = 1
        query!.findObjectsInBackgroundWithBlock({ (results: [AnyObject]?, error: NSError?) -> Void in

            if error != nil{// This never prints anything to console
                println(error)
            }

            if let results = results as? [PFObject] {
                for object in results {
                    let userPicture = object["image"] as! PFFile

                    userPicture.getDataInBackgroundWithBlock {
                        (imageData: NSData?, error: NSError?) -> Void in
                        if error == nil {
                            if let imageData = imageData {
                                let image = UIImage(data:imageData)
                                arrayToReturn.append(image!)
                            }
                        }
                    }
                }
            }
        })
    }
    return arrayToReturn
}//end of imageArrayFromUserList method

最佳答案

您还不了解完成处理程序的工作原理。 findObjectsInBackgroundWithBlock 旨在立即返回。它在后台线程上对查找任务进行排队。当任务完成时,可能会在同一个后台线程上调用完成处理程序代码。

参见:How to explain callbacks in plain english? How are they different from calling one function from another function?

因此,您错误地调试了,期望调试器在单步执行创建后台任务的主线程时在完成处理程序中命中断点。它不是那样工作的。

既然你对调试感到困惑,那么在每个阶段都有用的 println()s,例如:

        if error != nil{// This never prints anything to console
            println(error)
        }
        else {
            println("No error!")
        }

        if let results = results as? [PFObject] {
            println("Got \(results.count\) results!")
            for object in results {
                println("Got result: \(object)!")
                let userPicture = object["image"] as! PFFile

                userPicture.getDataInBackgroundWithBlock {
                    (imageData: NSData?, error: NSError?) -> Void in
                    if error == nil {
                        println("Got user picture!")
                        if let imageData = imageData {
                            let image = UIImage(data:imageData)
                            arrayToReturn.append(image!)
                        }
                    }
                    else {
                        println("could not get user picture!")
                    }
                }
            }
        }
        else {
            println("What the hell? Results was not a [PFObject]")
        }

现在关于正确设计回调:

您的主函数创建数据请求,然后立即返回。它应该返回 Void,而不是数组。

什么应该反射(reflect)新数据?假设它是一个名为 myTableView 的 UITableView。然后当数组被填充后,将其保存在类的存储属性中,并在对主线程的 dispatch_async 调用中调用 myTableView.reloadData()UITableViewDataSource 函数使用上述存储的数组属性。

我敢肯定这令人困惑。您需要阅读有关集成后台数据的完整教程。

有趣的是,我刚刚为另一个用户做了这件事!

Tutorial in retrieving, mutating and saving array from Parse.com in Swift with UITableView

关于ios - 解析查询,图像数组返回空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31777222/

相关文章:

ios - 为什么不更改 @ObservedObject 更新 UIViewRepresentable?

ios - 如何在构建 IPA 时修复 Xcode 6.1 错误

swift - 解析、云代码删除前

javascript - 设置替代 Node.js 服务以在本地与 Parse Server 通信

swift - 快速理解闭包

ios - 将委托(delegate)设置为对象

ios - 使用 swift 客户端库时服务器 Socket.io 回调崩溃

ios - 制作一个属于 UIPageViewController 一部分的工具栏

swift - 在 SwiftUI 中的 ActionSheet 上设置辅助功能标识符

ios - 在 UITableViewController 的 UINavigationItem 栏中从 "Done"更改后按下 "Edit"时触发什么?