解开可选值调度异步包装时意外发现 nil



我正在尝试在点击 postVC 上的按钮加载数据并导航到 guestVC 后实现从 Parse 服务器加载数据。它工作正常,并且在某个时候开始使应用程序崩溃......不知道为什么?我收到致命错误:在解开可选值时意外发现 nil...任何和所有的方向或帮助将不胜感激。谢谢!

import UIKit
import Parse
var postuuid = [String]()
class postVC: UITableViewController {
//postVC button click function
//clicked username button from post
    @IBAction func usernameBtn_click(sender: AnyObject) {
        let i = sender.layer.valueForKey("index") as! NSIndexPath
        let cell = tableView.cellForRowAtIndexPath(i) as! postCell
        // if user tapped on himself go home, else go guest
        if cell.usernameBtn.titleLabel?.text == PFUser.currentUser()?.username {
            let home = self.storyboard?.instantiateViewControllerWithIdentifier("homeVC") as! homeVC
            self.navigationController?.pushViewController(home, animated: true)    
        } else {
            let guest = self.storyboard?.instantiateViewControllerWithIdentifier("guestVC") as! guestVC
            self.navigationController?.pushViewController(guest, animated: true)
        }  
    } 

// guestVC relevant code
import UIKit
import Parse
var guestname = [String]()
class guestVC: UICollectionViewController {
    var uuidArray = [String]()
    var picArray = [PFFile]()
    // posts loading function
    func loadPosts() {     
            let query = PFQuery(className: "posts")
// app keeps crashing in line below when I try to load data to guestVC
            query.whereKey("username", equalTo: guestname.last!)
            query.limit = self.page
            query.findObjectsInBackgroundWithBlock( { (objects:[PFObject]?, error:NSError?) -> Void in
                if error == nil {
                    self.uuidArray.removeAll(keepCapacity: false)
                    self.picArray.removeAll(keepCapacity: false)
                    for object in objects! {
                        self.uuidArray.append(object.valueForKey("uuid") as! String)
                        self.picArray.append(object.valueForKey("pic") as! PFFile)
                    }
                    self.collectionView?.reloadData()
                } else {
                    print(error!.localizedDescription)
                }
                dispatch_async(dispatch_get_main_queue(), { () -> Void in
                    // code here will be executed as the main queue
                })
            })
    }

你使用了很多感叹号来强制解开代码中的可选值,这是一个坏习惯。例如,您可以通过以下方式安全地解开 guestname.last 的包装:

guard let lastItem = guestname.last else {
// do something else
return
}
query.whereKey("username", equalTo: lastItem)

在添加或追加之前,请检查字典键是否具有有效值。 检查"uuid"或"pic"键在字典中是否有价值。如果有,则添加/附加。

相关内容

最新更新