Swift Thread1:EXC_BAD_INSTRUCTION(代码= EXC_I386_INVOP,子代码= 0x0)

时间:2016-04-22 21:20:29

标签: ios xcode swift swift2

There is a SS of error

这是在向viewDidLoad中添加刷新方法以进行刷新后发生的。我使用parse.com并且关注者表是空的。

我发现了一些关于某些错误的问题。但我没有发现与我的问题相同或者我不理解的事情。

我如何解决这个问题是什么?

import UIKit
import Parse

class TableViewController: UITableViewController {

    var usernames = [""]
    var userids = [""]
    var isFollowing = ["":false]

    var refresher: UIRefreshControl!

    func refresh() {

        var query = PFUser.query()

        query?.findObjectsInBackgroundWithBlock({ (objects, error) -> Void in

            if let users = objects {

                self.usernames.removeAll(keepCapacity: true)
                self.userids.removeAll(keepCapacity: true)
                self.isFollowing.removeAll(keepCapacity: true)

                for object in users {

                    if let user = object as? PFUser {

                        if user.objectId! != PFUser.currentUser()?.objectId {

                            self.usernames.append(user.username!)
                            self.userids.append(user.objectId!)

                            var query = PFQuery(className: "followers")

                            query.whereKey("follower", equalTo: (PFUser.currentUser()?.objectId)!)
                            query.whereKey("following", equalTo: user.objectId!)

                            query.findObjectsInBackgroundWithBlock({ (objects, error) -> Void in

                                if let objects = objects {

                                    if objects.count > 0 {

                                        self.isFollowing[user.objectId!] = true

                                    } else {

                                        self.isFollowing[user.objectId!] = false

                                    }
                                }

                                if self.isFollowing.count == self.usernames.count {

                                    self.tableView.reloadData()

                                    self.refresher.endRefreshing()

                                }


                            })



                        }
                    }

                }



            }



        })





    }



    override func viewDidLoad() {
        super.viewDidLoad()

        refresher = UIRefreshControl()
        refresher.attributedTitle = NSAttributedString(string: "Pull to refresher")
        refresher.addTarget(self , action: "refresh" , forControlEvents:  UIControlEvents.ValueChanged)
        self.tableView.addSubview(refresher)
        refresh()
            }

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

    // MARK: - Table view data source

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        // #warning Incomplete implementation, return the number of sections
        return 1
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // #warning Incomplete implementation, return the number of rows
        return usernames.count
    }



    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! UITableViewCell
        cell.textLabel?.text = usernames[indexPath.row]
        let followedOnjectId = userids[indexPath.row]
        if isFollowing[followedOnjectId] == true {
        cell.accessoryType = UITableViewCellAccessoryType.Checkmark
        }
        return cell
    }

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        var cell:UITableViewCell = tableView.cellForRowAtIndexPath(indexPath)!
        let followedOnjectId = userids[indexPath.row]

        if isFollowing[followedOnjectId] == false{
            isFollowing[followedOnjectId] = true

        cell.accessoryType = UITableViewCellAccessoryType.Checkmark

        var following = PFObject(className: "followers")
        following["following"] = userids[indexPath.row]
        following["follower"] = PFUser.currentUser()?.objectId

        following.saveInBackground()
        }else
        {
            isFollowing[followedOnjectId] = false
            cell.accessoryType = UITableViewCellAccessoryType.None
            var query = PFQuery(className: "followers")
            query.whereKey("follower", equalTo: PFUser.currentUser()!.objectId!)
            query.whereKey("following", equalTo: userids[indexPath.row])
            query.findObjectsInBackgroundWithBlock({ (objects, error) -> Void in
                if let objects = objects {
                    for objects in objects {
                    objects.deleteInBackground()
                    }
                }

            })


        }
    }

}

1 个答案:

答案 0 :(得分:1)

(PFUser.currentUser()?.objectId)!

或query-var为nil。这导致了例外。

你应该使用if let construct

if let objectId = PFUser.currentUser()?.objectId {
    query.whereKey("follower", equalTo: objectId)
}

或者如果代码应该在所有值存在时执行,则可以使用guard关键字。

guard let a = optionalType?.variable?.a, b = optionalType?.variable?.b else { return }