【问题标题】:Swift Async Alamofire returnSwift Async Alamofire 返回
【发布时间】:2015-08-04 05:03:48
【问题描述】:

我在返回注释上得到一个空值,我确定这是因为异步范围,我已经尝试了一切来获取

 var annotations: [TestAnnotation] = []

返回值,但我不能。循环正确地附加了 makeRequest 范围内的值。

func makeRequest(url : String, params : [String : String]?, completionHandler: (responseObject: JSON?, error: NSError?) -> ())  -> Request? {

    return Alamofire.request(.GET, url, parameters: params, encoding: .URL)
        .responseString { request, response, responseBody, error in completionHandler(
            responseObject:
            {
                // JSON to return
                var json : JSON?
                if let response = responseBody {
                    // Parse the response to NSData
                    if let data = (response as NSString).dataUsingEncoding(NSUTF8StringEncoding) {
                        json = JSON(data: data)
                    }
                }

                return json

                }(), error: error)
    }
}

func annotations() -> [TestAnnotation] {
    var annotations: [TestAnnotation] = []

    var points: NSDictionary = [:]
    self.makeRequest("http://192.168.0.10/test/globe.php", params: nil) { json, error in

        if let data = json!.rawData() {
            let json = JSON(data: data)

            for var i = 0; i < json["venues"].count; i++
            {
                let lat = (json["venues"][i]["latitude"]).doubleValue as CLLocationDegrees
                let lon = (json["venues"][i]["longitude"]).doubleValue as CLLocationDegrees
                let venuesid = (json["venues"][i]["id"]).stringValue as String
                ///
                let coordinate1 : CLLocationCoordinate2D = CLLocationCoordinate2DMake(lat, lon)

                let a1: TestAnnotation = TestAnnotation(coordinate: coordinate1, title: glimpid)
                annotations.append(a1)

            }
        }

    }
    return annotations

}

【问题讨论】:

  • 注解函数返回值为空?
  • 是的,如果不清楚,抱歉

标签: swift asynchronous alamofire


【解决方案1】:

您只是在代码中返回一个空数组,丢弃结果并忽略收到的错误。如果要从异步调用返回结果,也必须异步执行。像这样的:

func annotations(onComplete: (NSError?, [TestAnnotations]?) -> Void) {
    self.makeRequest("http://192.168.0.10/test/globe.php", params: nil) { json, error in

        var annotations: [TestAnnotations]?
        if let data = json!.rawData() {
            let json = JSON(data: data)
            annotations = [TestAnnotation]()

            for var i = 0; i < json["venues"].count; i++
            {
                let lat = (json["venues"][i]["latitude"]).doubleValue as CLLocationDegrees
                let lon = (json["venues"][i]["longitude"]).doubleValue as CLLocationDegrees
                let venuesid = (json["venues"][i]["id"]).stringValue as String
                ///
                let coordinate1 : CLLocationCoordinate2D = CLLocationCoordinate2DMake(lat, lon)

                let a1: TestAnnotation = TestAnnotation(coordinate: coordinate1, title: glimpid)
                annotations?.append(a1)

            }
        }

        onComplete(error, annotations)

    }
}

编辑:有很多方法可以调用这个方法,查看Closures documentation 看看如何传递你的闭包参数。这是其中之一:

self.annotations { error, annotations in 
    // Check for errors
    if let error = error {
        NSLog("Received error: %@", error)
    }
    if let annotations = annotations {
        // Do whatever you want with your received annotations, like saving as property and reloading a table view
        self.savedAnnotations = annotations
        self.tableView.reloadData()
    }
}

【讨论】:

  • 我现在怎么调用注解?参数是什么?
【解决方案2】:

试试这个:

Alamofire.request(.GET, url, parameters: params, encoding: .URL)
        .responseString { request, response, responseBody, error in completionHandler(
            responseObject:
            {
                // JSON to return
                var json : JSON?
                if let response = responseBody {
                    // Parse the response to NSData
                    if let data = (response as NSString).dataUsingEncoding(NSUTF8StringEncoding) {
                        json = JSON(data: data)
                        self.annotations(json)
                    }
                }

                return json

                }(), error: error)
    }

func annotations(json : JSON) -> [TestAnnotation] {
    var annotations: [TestAnnotation] = []

    var points: NSDictionary = [:]

            for var i = 0; i < json["venues"].count; i++
            {
                let lat = (json["venues"][i]["latitude"]).doubleValue as CLLocationDegrees
                let lon = (json["venues"][i]["longitude"]).doubleValue as CLLocationDegrees
                let venuesid = (json["venues"][i]["id"]).stringValue as String
                ///
                let coordinate1 : CLLocationCoordinate2D = CLLocationCoordinate2DMake(lat, lon)

                let a1: TestAnnotation = TestAnnotation(coordinate: coordinate1, title: glimpid)
                annotations.append(a1)

            }

    }
    return annotations
}

不知道对你有没有帮助

注意:您正在使用 Alamofire 进行请求,而 SwiftJSON 可以轻松工作,您可以通过这样做进行耦合:

Alamofire.request(.GET, url, parameters: parameters)
  .responseJSON { (req, res, json, error) in
    if(error != nil) {
      NSLog("Error: \(error)")
      println(req)
      println(res)
    }
    else {
      NSLog("Success: \(url)")
      var json = JSON(json!)
    }
  }

SwiftyJSON - Alamofire

【讨论】:

  • 您仍然返回一个空数组。在请求完成并解析 JSON 之前,不会填充数组,并且您会更早地将结果返回给调用者。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-29
  • 1970-01-01
  • 2016-06-02
  • 2016-12-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多