我正在研究一个简单的项目,以帮助学习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调用本身......
任何人都可以提供任何见解吗?谢谢
答案 0 :(得分:2)
发生的事情是您有多个线程同时尝试访问Dictionary
。当您在parameters
中修改didUpdateLocations
时,它可能会在内存中移动,而在Alamofire中读取它会导致EXC_BAD_ACCESS异常。
要解决这个问题,我会停止在parameters
内更新didUpdateLocations
字典 - 将latestLocation
属性添加到视图控制器并进行更新。然后,在updatePost
内,创建参数字典并将其传递给Alamofire.request
。