Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 异步SQL方法的返回值_Objective C - Fatal编程技术网

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
    语句,然后退出方法体返回的变量
    结果
    尚未设置
  • 稍后,SQL查询完成并执行块。但返回结果为时已晚,因为执行已退出方法
    -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的变量的内容?