2014-06-20 13 views
0

異步這個函數有一個奇怪的問題:EXC_BAD_INSTRUCTION在使用NSURLConnection的

func retrieveToken() { 
     var postRequest = NSMutableURLRequest(URL: NSURL(string: "http://example.com")); 
     postRequest.HTTPMethod = "POST" 
     var responseData = NSMutableData(); 
     NSURLConnection.sendAsynchronousRequest(postRequest, queue: NSOperationQueue.mainQueue(), completionHandler: { (response: NSURLResponse!, data: NSData!, error: NSError!) -> Void in 
      responseData = NSMutableData(data:data); 
      }) 
     var responseDict:Dictionary<String,AnyObject> = NSJSONSerialization.JSONObjectWithData(responseData, options: NSJSONReadingOptions.MutableLeaves, error: nil) as Dictionary; 
    } 

這個功能應該發送POST請求的URL(有效期)接收的令牌。但是,由於某些原因,當我運行此代碼時,我在將postRequest的HTTPMethod設置爲POST的行處得到EXC_BAD_INSTRUCTION。我覺得我忽略了一些非常明顯的東西,但我看不出什麼。哪裏不對?

回答

1

你俯瞰(至少)兩個要點。

  1. 您在完成處理程序中傳遞的數據是可選的,因此您需要爲其準備無數據。
  2. 您的NSJSONSerialization在調用sendAsynchronousReguest後立即執行,並且完成處理程序不會在此時被調用。

這是最有可能的是,第一個問題可能導致您所遇到的崩潰,因爲你在某些時候試圖取消引用data但它恰好是零。但它可能是NSJSONSerialization不喜歡被傳遞一個空的NSMutableData實例。

閱讀Optionals,然後閱讀異步編程,然後再看看您想要實現的目標。隨着接口凍結等待您的網絡請求完成,僅使用同步網絡請求將導致糟糕的用戶體驗。

+0

你是對的,當我將空數據傳遞給NSJSONSerialization時,它崩潰。 sendSynchronousRequest解決方案實際上只是讓我現在可以專注於程序的其他部分,但我不會堅持到最終結果。 – evilgoldfish

+1

這很可能是因爲您試圖強制將其向下轉換爲非可選字典並且它要返回nil。可能你應該使responseDict爲可選:'var responseDict:Dictionary ? = ... as?字典' – ikuramedia

+0

請注意,這目前打破了Playground,我認爲這是與Quicklook有關,但沒有挖得太深。可選項絕對是你需要的。 – ikuramedia

0

我用sendSynchronousRequest,而不是固定的問題:

responseData = NSURLConnection.sendSynchronousRequest(postRequest, returningResponse: nil, error: nil) as NSData;