[英]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.