2014-12-06 20 views
0

我正在研究一個簡單的項目來幫助學習Swift,並且我遇到了一個我認爲具有更深層次影響/學習機會(嘗試着眼於光明方面)的問題。使用AlamoFire進行HTTP請求導致EXC_BAD_ACCESS

高級別問題是,當我POST使用AlamoFire JSON編碼參數,一個EXC_BAD_ACCESS誤差迅速出現在代碼單獨的行,其中我設置的參數(具體而言CoreLocation管理器的「didUpdateLocations」)中的一個.. 。這裏是代碼:

在ViewController中,我創建了一個可變字典:

var parameters = [String:AnyObject]() 

而且,對於didUpdateLocations事件,我給你更新的緯度/經度值在可變字典中的各個按鍵。

class ViewController: UIViewController, CLLocationManagerDelegate { 
    let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate 
    ... 
    func locationManager(locManager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) { 
     appDelegate.parameters["longitude"] = locManager.location.coordinate.longitude 
     appDelegate.parameters["latitude"] = locManager.location.coordinate.latitude 
    } 

最後,我有一個周期函數(使用NSTimer.scheduledTimerWithTimeInterval)是POST到服務器。

func updatePost() { 
    println("POSTing update") 

    Alamofire.request(.POST, "http://server.co/endpoint", 
      parameters: appDelegate.parameters, encoding: .JSON) 
} 

如果我註釋掉Alamofire POST,一切都很好。 隨着的文章中,我得到的didUpdateLocations的第一行(其中longitude鍵設置)

我懷疑它的東西做的參數是如何通過Alamofire的編碼程序轉換的EXC_BAD_ACCESS錯誤,但我不知道爲什麼它會出現在didUpdateLocations函數中,而不是在Alamofire調用本身...

任何人都可以提供任何見解嗎?謝謝

+0

你爲什麼要把所有東西放在AppDelegate中?全局共享可變狀態是EXC_BAD_ACCESS和其他所有權錯誤的處方。 – mattt 2014-12-06 01:52:42

+0

這是一個持久的形式,我早些時候嘗試,但很好的一點。我只是將'parameters'移到ViewController中,同樣的問題正在發生。 – Dan 2014-12-06 02:11:43

回答

2

發生什麼事情是,你有多個線程同時嘗試訪問Dictionary。當您在didUpdateLocations中修改parameters時,它在Alamofire內讀取時可能會移入內存,導致EXC_BAD_ACCESS異常。

要解決這個問題,我會停止更新didUpdateLocations中的parameters字典 - 將latestLocation屬性添加到您的視圖控制器並更新它。然後,在updatePost的內部,創建您的參數字典並將其傳遞給Alamofire.request

+0

這很有道理 - 謝謝!建議的解決方案奏效 – Dan 2014-12-06 02:27:04