gpt4 book ai didi

swift - 如何使用异步回调修改结构?

转载 作者:搜寻专家 更新时间:2023-11-01 05:41:57 25 4
gpt4 key购买 nike

我正在尝试使用多级嵌套异步回调更新结构,因为每个级别的回调都为下一批请求提供信息,直到一切都完成。这就像一个树结构。每次我只能到达下面的一个级别。

但是,第一次使用 inout 参数的尝试失败了。我现在知道了原因,多亏了这里的好答案: Inout parameter in async callback does not work as expected

我的任务仍然有待解决。我能想到的唯一方法就是将值存储到本地文件或持久化存储中,每次都直接修改它。在编写示例代码后,我认为全局变量也可以帮助我解决这个问题。但我想最好的方法是为这项工作提供一个结构实例。对于每一轮请求,我将这一轮的信息存储在一个地方,以避免不同轮次同时工作造成的困惑。

使用下面的示例代码,只有全局变量更新有效。我相信其他两个失败的原因与我上面提到的问题相同。

func testThis() {
var d = Data()
d.getData()
}

let uriBase = "https://hacker-news.firebaseio.com/v0/"
let u: [String] = ["bane", "LiweiZ", "rdtsc", "ssivark", "sparkzilla", "Wogef"]
var successfulRequestCounter = 0

struct A {}

struct Data {
var dataOkRequestCounter = 0
var dataArray = [A]()

mutating func getData() {
for s in u {
let p = uriBase + "user/" + s + ".json"
getAnApiData(p)
}
}

mutating func getAnApiData(path: String) {
var req = NSURLRequest(URL: NSURL(string: path)!)
var config = NSURLSessionConfiguration.ephemeralSessionConfiguration()
var session = NSURLSession(configuration: config)
println("p: \(path)")
var task = session.dataTaskWithRequest(req) {
(data: NSData!, res: NSURLResponse!, err: NSError!) in
if let e = err {
// Handle error
} else if let d = data {
// Successfully got data. Based on this data, I need to further get more data by sending requests accordingly.
self.handleSuccessfulResponse()
}
}
task.resume()
}

mutating func handleSuccessfulResponse() {
println("successfulRequestCounter before: \(successfulRequestCounter)")
successfulRequestCounter++
println("successfulRequestCounter after: \(successfulRequestCounter)")
println("dataOkRequestCounter before: \(dataOkRequestCounter)")
dataOkRequestCounter++
println("dataOkRequestCounter after: \(dataOkRequestCounter)")
println("dataArray count before: \(dataArray.count)")
dataArray.append(A())
println("dataArray count after: \(dataArray.count)")
if successfulRequestCounter == 6 {
println("Proceeded")
getData()
}
}
}

func getAllApiData() {
for s in u {
let p = uriBase + "user/" + s + ".json"
getOneApiData(p)
}
}

好吧,在我的实际项目中,我成功地在第一批回调的结构中附加了一个 var,但在第二批回调中失败了。但是我没能让它在示例代码中工作。我尝试了很多次,以至于我花了很长时间才用示例代码更新我的问题。无论如何,我认为主要问题是为这项任务学习适当的方法。所以我暂时把它放在一边。

考虑到闭包的工作原理,我想没有办法用闭包来做到这一点。但还是想请教和学习最好的方法。

谢谢。

最佳答案

我所做的是使用 inout NSMutableDictionary。

func myAsyncFunc(inout result: NSMutableDictionary){
let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT
dispatch_async(dispatch_get_global_queue(priority, 0)) {
let intValue = result.valueForKey("intValue")
if intValue as! Int > 0 {
//Do Work
}
}
dispatch_async(dispatch_get_main_queue()) {
result.setValue(0, forKey: "intValue")
}
}

我知道您已经尝试过使用 inout,但是 NSMutableDictionary 在没有其他对象时为我工作。

关于swift - 如何使用异步回调修改结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28254254/

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