gpt4 book ai didi

swift - 从完成处理程序返回值

转载 作者:搜寻专家 更新时间:2023-11-01 06:39:24 24 4
gpt4 key购买 nike

我想从 api 调用返回值。

调用我的 api 类(我想获取 res 中的值):

class ViewController: UIViewController {

override func viewDidLoad() {
super.viewDidLoad()

let t = Api_test();
let res = t.getSomething();

print(res)
}
}

API 类:

import Foundation

class Api_test {

func getAllStations(completionHandler: (response : XMLIndexer) -> ()) {

getRequest { result in
completionHandler(response: SWXMLHash.parse(result))
};
}

func getRequest(completionHandler: (result: NSData) -> ()) {
let baseUrl = "http://api.test.com"
let request = NSMutableURLRequest(URL: NSURL(string: baseUrl)!)
let session = NSURLSession.sharedSession()
request.HTTPMethod = "GET"

let task = session.dataTaskWithRequest(request) {
(data, response, error) in

if data == nil {
print("dataTaskWithRequest error: \(error)")
return
} else {
completionHandler(result: data!)
}
}
task.resume()
}
}

一切都按预期工作,但我坚持要将值返回给 getSomething 函数。数据为 xml 格式。如何在 res (viewDidLoad) 中获取结果集作为返回值?

最佳答案

NSURLSession 是一个完全异步的网络 API,因此理想情况下,您的 View Controller 应该正确运行,而不是等待数据从网络返回。

这里有三个选项:

  1. 您可以将完成 block 传递给 getSomething 并将结果传递给 block :

    func getSomething(completionHandler: (result: XMLIndexer) -> ()) {
    getRequest { result in
    completionHandler(result: SWXMLHash.parse(result))
    }
    }

    override func viewDidLoad() {
    ...
    t.getSomething { res in
    print(res)
    }
    }
  2. 如果在 View 显示到屏幕上之前您迫切需要手头的 XML 数据,您可以让主线程等待网络操作完成执行。您可以使用 dispatch_semaphore_t :

    func getSomething() -> XMLIndexer? {
    var xml: XMLIndexer? = nil
    let semaphore: dispatch_semaphore_t = dispatch_semaphore_create(0)
    getRequest { result in
    xml = SWXMLHash.parse(result)
    dispatch_semaphore_signal(semaphore)
    }
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER)
    return xml
    }
  3. 最后一个选项是,您可以使用另一个同步解析的第 3 方。有一个伟大的名字叫Ono :

    var error: NSError?
    let xml = ONOXMLDocument(data: result, error: &error)

关于swift - 从完成处理程序返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37378340/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com