无法使用类型'((NSData!,NSError!) - > Void)'的参数列表调用'getDataInBackgroundWithBlock'

时间:2015-04-21 02:25:14

标签: xcode swift parse-platform

我使用swift 6.3并有2个类似的错误

  1. Cannot invoke 'findObjectsInBackgroundWithBlock' with an argument list of type '(([AnyObject]!, NSError!) -> Void)'

  2. Cannot invoke 'getDataInBackgroundWithBlock' with an argument list of type '((NSData!, NSError!) -> Void)'

  3. 有什么想法吗?

    import Parse
    import UIKit
    
    class UserVC: UIViewController, UITableViewDataSource, UITableViewDelegate {
        @IBOutlet var resultTable: UITableView!
        var resultNameArray = [String]()
        var resultUserNameArray = [String]()
        var resultUserImageFiles = [PFFile]()
    
        override func viewDidLoad() {
            super.viewDidLoad()
        }
    
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
        }
    
        override func viewDidAppear(animated: Bool) {
            resultNameArray.removeAll(keepCapacity: false)
            resultUserNameArray.removeAll(keepCapacity: false)
            resultUserImageFiles.removeAll(keepCapacity: false)
    
            var query = PFUser.query()
    
            query!.whereKey("username", notEqualTo: PFUser.currentUser()!.username!)
    
            //// here is the error////
            query.findObjectsInBackgroundWithBlock {(objects:[AnyObject]!, error:NSError!) -> Void in
                if error == nil {
                    for object in objects {
                        self.resultNameArray.append(object.objectForKey("profileName") as String)
                        self.resultUserImageFiles.append(object.objectForKey("photo") as PFFile)
                        self.resultUserNameArray.append(object.objectForKey("username") as String)
    
                        self.resultsTable.reloadData()
                    }
                }
            }
        }
    
        func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return resultNameArray.count
        }
    
        func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
            return 64
        }
    
        func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
            var cell:User_Cell = tableView.dequeueReusableCellWithIdentifier("Cell") as! User_Cell
            cell.profileLbl.text = self.resultNameArray[indexPath.row]
            cell.userLbl.text = self.resultUserNameArray[indexPath.row]
    
            //// here is the error////
            self.resultUserImageFiles[indexPath.row].getDataInBackgroundWithBlock {
                (imageData:NSData!, error:NSError!) -> Void in
    
                if error == nil {
                    let image = UIImage(data: imageData)
                    cell.imgView.image = image
    
                }
            }
    
            return cell
        }
    }
    

3 个答案:

答案 0 :(得分:7)

第一个错误是由于块参数错误造成的。 objectserror都应该是可选的。

如下所示:

query?.findObjectsInBackgroundWithBlock({ (objects: [AnyObject]?, error: NSError?) -> Void in

第二个原因是一样的。 imageDataerror也是可选的。

如下所示:

self.resultUserImageFiles[indexPath.row].getDataInBackgroundWithBlock { (imageData: NSData?, error: NSError?) -> Void in

所有固定代码:

class UserVC: UIViewController, UITableViewDataSource, UITableViewDelegate {
    @IBOutlet var resultTable: UITableView!
    var resultNameArray = [String]()
    var resultUserNameArray = [String]()
    var resultUserImageFiles = [PFFile]()

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    override func viewDidAppear(animated: Bool) {
        resultNameArray.removeAll(keepCapacity: false)
        resultUserNameArray.removeAll(keepCapacity: false)
        resultUserImageFiles.removeAll(keepCapacity: false)

        var query = PFUser.query()

        query!.whereKey("username", notEqualTo: PFUser.currentUser()!.username!)

        //// here is the error////
        query?.findObjectsInBackgroundWithBlock({ (objects: [AnyObject]?, error: NSError?) -> Void in
            if error == nil {
                if let objects = objects {
                    for object in objects {
                        self.resultNameArray.append(object.objectForKey("profileName") as! String)
                        self.resultUserImageFiles.append(object.objectForKey("photo") as! PFFile)
                        self.resultUserNameArray.append(object.objectForKey("username") as! String)

                        self.resultsTable.reloadData()
                    }
                }
            }
        })
    }

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return resultNameArray.count
    }
    func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        return 64
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        var cell:User_Cell = tableView.dequeueReusableCellWithIdentifier("Cell") as! User_Cell
        cell.profileLbl.text = self.resultNameArray[indexPath.row]
        cell.userLbl.text = self.resultUserNameArray[indexPath.row]

        //// here is the error////
        self.resultUserImageFiles[indexPath.row].getDataInBackgroundWithBlock { (imageData: NSData?, error:NSError?) -> Void in
            if error == nil {
                let image = UIImage(data: imageData!)
                cell.imgView.image = image
            }
        }

        return cell
    }
}

答案 1 :(得分:1)

在swift 1.2(Xcode更新到6.3)中,选项被更改了,所以现在,NSError是可选的。

这使您的功能如下:

query?.findObjectsInBackgroundWithBlock({ (objects: [AnyObject]?, error: NSError?) -> Void in 
    // Do whatever you want with these objects
})

答案 2 :(得分:-2)

现在效果很好,其他错误出现在这里

   self.resultsTable.reloadData()

错误UsersVC没有名为resultsTable的成员。