2014-10-06 89 views
1

因此,我在快速應用程序中遇到了與閉包有關的問題,其中我試圖將解析用作BaaS。特別是我不明白爲什麼我不能在閉包中分配一個變量並在其外部訪問它。我的代碼,做工作的樣子:瞭解快速關閉

class SecondView: UIViewController { 

@IBOutlet var label:UILabel! 

var budgetInfo:NSArray = [] 

var item:PFObject! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    var query = PFQuery(className: "Budget") 
    query.whereKey("creditor", equalTo: "rent") 
    query.getFirstObjectInBackgroundWithBlock({ 
     (object:PFObject!, error:NSError!) in 

     self.label.text = NSString(format: "%@", object.objectForKey(key: "amount") as NSNumber) 

    }) 

} 

此代碼的工作完美,當我嘗試如何以往任何時候都與這樣的塊分配var item:PFObject!

class SecondView: UIViewController { 

@IBOutlet var label:UILabel! 

var budgetInfo:NSArray = [] 

var item:PFObject! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    var query = PFQuery(className: "Budget") 
    query.whereKey("creditor", equalTo: "rent") 
    query.getFirstObjectInBackgroundWithBlock({ 
     (object:PFObject!, error:NSError!) in 

     self.item = object 

    }) 

    label.text = NSString(format: "%@", item.objectForKey("amount") as NSNumber) 
} 

我得到指出

異常
unexpectedly found nil when unwrapping optional 

所以很明顯,項目變量沒有在閉包中被賦值,那麼這是否意味着我應該將所有的值都分配給閉包中,還是我要留下什麼東西?任何幫助,將不勝感激。

回答

1

它被賦值,它只是在閉包完成執行之前發生。這就是爲什麼

item.objectForKey("amount") 

「項目」是零

的解決方案 - 把你擁有的任何邏輯沒有關閉,這是異步的,我相信裏面。

+0

感謝您澄清。我當時就是這麼想的,但我的經驗不足使我不確定。試圖寫出最乾淨,最明智的代碼。 – MiCo 2014-10-06 07:07:59