我如何 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 文档 =)
使用来自异步任务的 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
}
}
这是我想要从中获取 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 文档 =)
使用来自异步任务的 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
}
}