2014-12-06 2 views
0

저는 Swift를 배우는 데 도움이되는 간단한 프로젝트를 진행하고 있으며, 더 깊은 의미와 학습 기회를 가지고 있다고 생각되는 문제에 직면 해 있습니다.AlamoFire로 HTTP 요청하기 EXC_BAD_ACCESS가 발생했습니다.

높은 수준의 문제는 AlamoFire를 사용하여 JSON 인코딩 된 매개 변수를 POST 할 때 EXC_BAD_ACCESS 오류가 매개 변수 중 하나 (특히 CoreLocation Manager의 "didUpdateLocations")를 설정하는 별도의 코드 줄에 빠르게 나타납니다. . didUpdateLocations 이벤트, 나는 변경 가능한 사전에 각각의 키에 업데이트 된 위도/경도 값을 할당,

var parameters = [String:AnyObject]() 

을 그리고 :의 ViewController에서

, 나는 변경 가능한 사전을 만들 : 여기에 코드입니다.

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로 , 나는합니다 (longitude 키가 설정 됨) didUpdateLocations의 첫 번째 줄

나는 그것이 매개 변수가 Alamofire의 인코딩 루틴에 의해 변환하는 방법을 함께 할 수있는 뭔가 용의자의 EXC_BAD_ACCESS 오류가 그러나 didUpdateLocations 함수에서 나타나지 않고 Alamofire 호출 자체에 나타나지 않는 이유는 알 수 없습니다 ...

누구든지 통찰력을 제공 할 수 있습니까? 고맙습니다.

+0

왜 AppDelegate에 모든 것을 넣고 있습니까? 전역 공유 가변 상태는 EXC_BAD_ACCESS 및 기타 소유권 오류의 제조법입니다. – mattt

+0

그것은 이전에 시도했던 것 이상의 형식 이었지만 좋은 지적이었습니다. 방금'parameters'를 ViewController로 옮겼고 같은 문제가 발생했습니다. – Dan

답변

2

무슨 일이 일어나고 있습니까? 복수 스레드가 Dictionary에 동시에 액세스하려고 시도하고 있습니다. parametersdidUpdateLocations으로 수정하면 Alamofire에서 읽는 동안 메모리에서 이동하여 EXC_BAD_ACCESS 예외가 발생합니다.

해결하려면 didUpdateLocations에서 parameters 사전을 업데이트하지 마세요.보기 컨트롤러에 latestLocation 속성을 추가하고 대신 업데이트하십시오. 그런 다음 updatePost 안에 매개 변수 사전을 만들고 Alamofire.request에 전달하십시오.

+0

그건 의미가 있습니다 - 고마워요! 제안 된 해결 방법 – Dan