我有一个处理输入的程序,一次一个记录。对于每个记录,它执行HTTP POST以查找某些信息(基于该记录的内容),并且它希望在记录的末尾追加它在响应中收到的一些信息。
出于我的目的,获取输入记录,执行HTTP POST以及将响应附加到记录的过程是原子操作。在Cocoa中,NSURLSession是异步的。我不确定如何等待响应并将其附加到当前记录,然后再转到下一条记录。
这是我的(非工作)代码。问题是我不想执行" record.append(结果)"直到关闭完成并生成"结果"。有一个密切相关的问题,"结果"在闭包中定义,不在其范围之外。我怎样才能得到我想要的行为? (我更喜欢在Swift中看到代码,但如果您知道如何在Objective-C中执行此操作,请告诉我,我会尝试翻译它。)
我也希望能够传递一些额外的信息(每次通过" for"循环时都会改变)到闭包,以便用于分析响应
我也想知道如何从闭包中获取多个输出参数。我想也许我可以有一个输出结构,所以它将是一个参数,但会保存我想要的各种信息。我想如果那是不可能的,我可以把我想到的多个输出参数打包成一个字符串,作为单个输出参数。
let regex0: NSRegularExpression = NSRegularExpression(pattern: "\\A.*Part1:(.*?)<.*Part2:(.*?)<.*Part 3:(.*?)<.*\\z", options: NSRegularExpressionOptions.DotMatchesLineSeparators, error: nil)!
let wdivURL = NSURL(string: "http://NotTheRealDomain.com")
let request = NSMutableURLRequest(URL:wdivURL!)
request.HTTPMethod = "POST"
var myArray: [String] = ["First", "Second", "Third"]
for record in myArray {
var bodyData: String = "Not the real body" + record
request.HTTPBody = bodyData.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {data, response, error in
if error != nil {
println("NSURLSession error = \(error)")
return
}
var responseString = NSString(data: data, encoding: NSUTF8StringEncoding)!
var results: String = regex0.stringByReplacingMatchesInString(responseString as String, options: NSMatchingOptions.allZeros, range: NSMakeRange(0, responseString.length), withTemplate: "\t$1\t$2\t$3")
}
task.resume()
record.append(results)
}