在同步循环

时间:2015-06-07 22:33:12

标签: macos cocoa nsurlsession

我有一个处理输入的程序,一次一个记录。对于每个记录,它执行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)
}

0 个答案:

没有答案