0

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

高级问题是,当我使用 AlamoFire 发布 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
    }

最后,我有一个NSTimer.scheduledTimerWithTimeIntervalPOST 到服务器的周期性函数(使用 )。

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 调用本身中......

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

4

1 回答 1

2

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

为了解决这个问题,我将停止parameters从内部更新字典didUpdateLocations- 将一个latestLocation属性添加到您的视图控制器并更新它。然后,在内部updatePost,创建参数字典并将其传递给Alamofire.request.

于 2014-12-06T02:19:47.643 回答