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

Posted

技术标签:

【中文标题】使用 AlamoFire 发出 HTTP 请求会导致 EXC_BAD_ACCESS【英文标题】:Making HTTP request with AlamoFire causes EXC_BAD_ACCESS 【发布时间】:2014-12-06 00:45:23 【问题描述】:

我正在开展一个帮助学习 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
    

最后,我有一个 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 调用本身中......

谁能提供任何见解?谢谢

【问题讨论】:

你为什么要把所有的东西都放在 AppDelegate 中?全局共享可变状态是 EXC_BAD_ACCESS 和其他所有权错误的秘诀。 这是我之前尝试过的一种保留形式,但很好。我刚刚将 parameters 移动到 ViewController 中,同样的问题正在发生。 【参考方案1】:

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

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

【讨论】:

有道理-谢谢!建议的解决方案有效

以上是关于使用 AlamoFire 发出 HTTP 请求会导致 EXC_BAD_ACCESS的主要内容,如果未能解决你的问题,请参考以下文章

Alamofire HTTP 请求失败

如何使用操作查询发出多个 Alamofire 请求

经过身份验证的 http 请求 swift Alamofire

alamofire 499 使用标头和参数发出获取请求时

为啥即使我使用 Alamofire 发出请求,我的应用程序仍然冻结?

由于 TIC SSL 信任错误,无法使用 Alamofire 发出请求