使用AlamoFire发出HTTP请求会导致EXC_BAD_ACCESS

时间:2014-12-06 00:45:24

标签: ios swift alamofire

我正在研究一个简单的项目,以帮助学习Swift,我遇到了一个我认为有更深层次的影响/学习机会的问题(试图从好的方面看)。

高级问题是,当我使用AlamoFire POST JSON编码的参数时,EXC_BAD_ACCESS错误很快出现在我设置其中一个参数的单独代码行中(特别是CoreLocation Manager的“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
    }

最后,我有一个POST给服务器的周期函数(使用NSTimer.scheduledTimerWithTimeInterval)。

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

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

如果我评论Alamofire POST,一切都很好。 使用 POST,我在didUpdateLocations的第一行(设置longitude键的位置)收到EXC_BAD_ACCESS错误

我怀疑这与Alamofire的编码例程如何转换参数有关,但我不知道为什么它会出现在didUpdateLocations函数中而不是Alamofire调用本身......

任何人都可以提供任何见解吗?谢谢

1 个答案:

答案 0 :(得分:2)

发生的事情是您有多个线程同时尝试访问Dictionary。当您在parameters中修改didUpdateLocations时,它可能会在内存中移动,而在Alamofire中读取它会导致EXC_BAD_ACCESS异常。

要解决这个问题,我会停止在parameters内更新didUpdateLocations字典 - 将latestLocation属性添加到视图控制器并进行更新。然后,在updatePost内,创建参数字典并将其传递给Alamofire.request