简体   繁体   English

我如何从异步块返回值?

[英]How can i return value from async block?

This is the function I want to return value from but I know I am doing fool thing to return value from a closure that I used in from a library and it returns void, I think it is async void block, I am new in it please help. 这是我想从中返回值的函数,但我知道我在做愚蠢的事情,以从我从库中使用的闭包中返回值,并且它返回void,我认为这是异步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
            }
        }

Here are the errors that I got if I try to return value. 这是我尝试返回值时遇到的错误。 在此处输入图片说明

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;
    }

I also try this hack, but it always return default, because of grant central dispatch kind of thing working inside it, i again say i am new in ios please help in :( 我也尝试这种方法,但是它总是返回默认值,因为授予中央调度类的东西在里面工作,我再次说我是ios的新手,请在:(

You can pass completion closure and after success or failure request execute it. 您可以通过完成关闭,并在成功或失败请求之后执行它。

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

More about closures you can read at Apple documentation =) 您可以在Apple文档中阅读有关闭包的更多信息=)

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

Use Closures to return value from asynchronous tasks. 使用闭包从异步任务中返回值。 I have modified your code so you can try it, I didn't compile it just wrote for your reference. 我已经修改了您的代码,因此您可以尝试一下,我没有编译它,只是为您提供参考。

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
        }
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM