这就是我的代码现在的样子。我试图启动一个线程,但我的代码进入递归循环。我想从你那里得到我的错误原因,或者获得Swift模拟的精彩Java Thread.join()函数,这在这种情况下非常有用。
var ret: JSON = JSON("{\"code\":\"-3\"}")
var cont: Bool = true
dispatch_async(dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0), {
let req = Alamofire.request(.POST, "https://pornhub.com", parameters: parameters).validate().responseJSON { response in
switch response.result {
case .Success(let data):
let json = JSON(data)
print("TEST: " + ret.string!)
ret = json
case .Failure(let error):
print("TEST: " + ret.string!)
ret = (JSON("{\"code\":\"-2\"}"))
}
}
dispatch_async(dispatch_get_main_queue(), { () -> Void in
cont = false
})
})
while(cont) {
sleep(1)
}
return ret
答案 0 :(得分:0)
您应该如何做到这一点:
func post(parameters: [String : AnyObject], handler: Result<JSON, NSError> -> Void) {
Alamofire.request(.POST, "https://hehe.com", parameters: parameters)
.validate().responseJSON { response in
switch response.result {
case .Success(let jsonObject):
let json = JSON(jsonObject)
handler(.Success(json))
case .Failure(let error):
handler(.Failure(error))
}
}
}
您可以这样调用此方法:
post(["some" : "parameters"]) { response in
// The following part is called asynchronously, therefore you need to wrap UI updates in a dispatch main block:
dispatch_async(dispatch_get_main_queue()) {
switch response {
case .Success(let json):
print(json) // Update your UI with the json here
case .Failure(let error):
print(error) // Update your UI with an error here
}
}
}
答案 1 :(得分:-1)
因为你要阻止主线程,为什么在这种情况下甚至使用async
?
如果你不想阻止主线程(通常是UI线程,通常是一个非常糟糕的主意),你应该调用你在代码中提供的方法并传入一个“完成”块。该完成块将具有ret
值,并允许您的流程继续。使用该解释可能有点难以理解,因此我将尝试用伪代码解释它:
function mainThread()
{
var somethingINeed = firstAttempt()
doSomethingWithReturn(somethingINeed);
}
function firstAttempt()
{
var ret = doSomethingLong()
return ret
}
这样就可以阻止主线程完成你的长任务。而不是那个,而不是你的阻塞异步,尝试这样的事情(再次,伪代码):
function mainThread()
{
secondAttempt(method(var ret)
{
doSomethingWithReturn(ret);
})
}
function secondAttempt(functionBlock)
{
async{
var ret = doSomethingLong()
functionBlock(ret)
}
}