Objective c 异步SQL方法的返回值
我有以下代码:Objective c 异步SQL方法的返回值,objective-c,Objective C,我有以下代码: - (NSString *)obtenerDatosUsuario { __block NSString *result=@""; [self obtenerDatosUsuarioSQL:^(NSString *resultadoSQL){ result=resultadoSQL; }]; return result; } 我希望返回的内容是resultadoSQL如果我对方法内部发生的情况的猜测是正确的-obtenerdato
- (NSString *)obtenerDatosUsuario
{
__block NSString *result=@"";
[self obtenerDatosUsuarioSQL:^(NSString *resultadoSQL){
result=resultadoSQL;
}];
return result;
}
我希望返回的内容是
resultadoSQL
如果我对方法内部发生的情况的猜测是正确的-obtenerdatosuariosql:
(即,它在后台线程中执行长时间的操作,并将结果提供给传递的块参数),那么代码按以下顺序运行:
-obtenerdatosuario
-obtenerdatosuariosql:
,传递一个完成处理程序块-obtenerDatoSuario
末尾的return
语句,然后退出方法体返回的变量结果
尚未设置强>-obtenerdatosuario
有一些方法可以使这个异步方法同步运行(例如,信号量),但这通常是一个非常非常糟糕的想法。最有可能的是,
obtenerDatoSuarioSQL
是异步的,因为有可能(即使只有很小的可能)不会立即返回结果。可能SQL的速度会很慢。或者,您最终可能会执行来自多个线程的查询,因此此查询可能必须等待其他线程中的查询完成。或者可能还有其他原因。但不管是什么原因,这个方法是作为异步方法实现的,您应该接受它,而不是反对它。如果您将obtenerDatoSuario更改为同步返回,您将面临各种可能的问题
相反,您应该在代码中采用异步模式。例如,假设您有一些代码计划将obtenerdatosuario
的结果用于其他目的,例如:
NSString *resultadoSQL = [self obtenerDatosUsuario];
// use `resultadoSQL` here
只需将其更改为:
[self obtenerDatosUsuarioSQL:^(NSString *resultadoSQL){
// use `resultadoSQL` here
}];
// but not here
而且,如果您正在某个方法中使用obtenerDatoSuarioSQL
,并且您当前正在尝试立即返回该值,那么也可以将其更改为异步行为。例如,假设您有如下情况:
- (NSString *)someOtherMethod {
NSString *resultadoSQL = [self obtenerDatosUsuario];
// let's assume you're doing something else with `resultadoSQL` to build some other string
NSString *string = ... // some expression using `resultadoSQL`
return string;
}
然后,将其更改为也采用异步模式:
- (void)someOtherMethod:(void (^)(NSString *))completionHandler {
[self obtenerDatosUsuarioSQL:^(NSString *resultadoSQL){
NSString *string = ... // some expression using `resultadoSQL`
completionHandler(resultadoSQL);
}];
}
当您第一次遇到这种情况时,这可能看起来不必要地复杂,但异步编程非常关键,是Cocoa编程的基本部分,因此您必须对这些常见的异步模式(如块)有一定的了解。就个人而言,我们经常使用块语法,因此我在Xcode的“代码片段库”中提到了块语法,这大大简化了生活,让您摆脱了记忆非直观块语法的世界
但不要试图将异步方法包装到另一个方法中,使其同步运行。如果您这样做,您将面临许多类型的问题。是同步运行还是异步运行?在第二种情况下,您的
return
语句将在执行块之前运行,因此不会设置result
(它看起来是异步的:否则它只会返回一个NSString
,而不是接受一个块作为参数。)这段代码与swift有什么关系?该方法是异步的,但存在任何形式来获取返回的值@Nicolasmiarib因为我在Swift中得到了结果@是否有一种方法可以在返回中返回名为resultadoSQL的变量的内容?