Java Thread.join()的Swift模拟

时间:2016-07-19 16:23:30

标签: java ios swift multithreading

这就是我的代码现在的样子。我试图启动一个线程,但我的代码进入递归循环。我想从你那里得到我的错误原因,或者获得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

2 个答案:

答案 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)
    }
}