我如何 return 来自异步块的值?

How can i return value from async block?

这是我想要从中获取 return 值的函数,但我知道我正在对 return 从库中使用的闭包中的值做愚蠢的事情 returns void,我认为它是 async void 块,我是新手,请帮忙。 :(

   func xmlRequest(_ id:Int) -> String{
            var array1:Array<Any> = Array<Any>();
            array1.append("body" as Any);
            array1.append("date" as Any);
            array1.append("author_id" as Any);

            let con:NSDictionary = NSDictionary();
            var field2:Array<Any> = Array<Any>();
            field2.append([["id", "=", [id]]]);
            let url = Login.BASEURL+XMLRPC_SERVICE_OBJECT;
            let param3 = [Login.DATABASE, Login.LOGIN_ID, Login.PASSWORD, "mail.tracking.value","search_read",field2,con] as [Any];
            AlamofireXMLRPC.request(url, methodName: "execute_kw", parameters: param3).responseXMLRPC { (response: DataResponse<XMLRPCNode>) in
                switch response.result {
                case .success(let value):
                    return "success";
                case .failure(let error):
                    return error;
                }//switch end
            }
        }

以下是我尝试 return 值时遇到的错误。

func xmlRequest(_ id:Int) -> String{
        var array1:Array<Any> = Array<Any>();
        array1.append("body" as Any);
        array1.append("date" as Any);
        array1.append("author_id" as Any);

        let con:NSDictionary = NSDictionary();
        var field2:Array<Any> = Array<Any>();
        field2.append([["id", "=", [id]]]);
        let url = Login.BASEURL+XMLRPC_SERVICE_OBJECT;
        let param3 = [Login.DATABASE, Login.LOGIN_ID, Login.PASSWORD, "mail.tracking.value","search_read",field2,con] as [Any];
        var valueToReturn:String = "default"
        AlamofireXMLRPC.request(url, methodName: "execute_kw", parameters: param3).responseXMLRPC { (response: DataResponse<XMLRPCNode>) in
            switch response.result {
            case .success(let value):
                valueToReturn = "success"
            case .failure(let error):
                valueToReturn = "error"
            }//switch end
        }
        return valueToReturn;
    }

我也尝试过这个 hack,但它总是 return 默认值,因为 grant central dispatch 之类的东西在里面工作,我再次说我是 ios 的新人,请帮助:(

你可以通过完成闭包,在请求成功或失败后执行。

func xmlRequest(_ id:Int, completion: @escaping ((String) -> Void)){
    var array1:Array<Any> = Array<Any>();
    array1.append("body" as Any);
    array1.append("date" as Any);
    array1.append("author_id" as Any);

    let con:NSDictionary = NSDictionary();
    var field2:Array<Any> = Array<Any>();
    field2.append([["id", "=", [id]]]);
    let url = Login.BASEURL+XMLRPC_SERVICE_OBJECT;
    let param3 = [Login.DATABASE, Login.LOGIN_ID, Login.PASSWORD, "mail.tracking.value","search_read",field2,con] as [Any];

    AlamofireXMLRPC.request(url, methodName: "execute_kw", parameters: param3).responseXMLRPC { (response: DataResponse<XMLRPCNode>) in
        var valueToReturn:String = "default"
        switch response.result {
        case .success(let value):
            valueToReturn = "success"
        case .failure(let error):
            valueToReturn = "error"
        }

        completion(valueToReturn)
    }
}

有关闭包的更多信息,请参阅 Apple 文档 =)

https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html

使用来自异步任务的 Closures 到 return 值。我已经修改了你的代码,你可以试试,我没有编译它只是写给你参考。

func xmlRequest(_ id:Int, completion: @escaping (_ response:AnyObject) -> (), failure onFailure:@escaping (_ error:String, _ statusCode:NSInteger) -> ()){

        /*
        Your code
        */

        AlamofireXMLRPC.request(url, methodName: "execute_kw", parameters: param3).responseXMLRPC { (response: DataResponse<XMLRPCNode>) in
            switch response.result {
            case .success(let value):
                completion("success")
            case .failure(let error):
                onFailure("error", error)
            }//switch end
        }
    }