iOS从方法返回块值

时间:2014-07-30 09:04:54

标签: ios block objective-c-blocks

我如何返回变量" myDoub(例如= 65)" out of method and out block ??

- (double)executeRequestUrlString:(NSString *)urlString withBlock:(double (^)(double myDoub))block {
    [NSURLConnection sendAsynchronousRequest:request
                                       queue:[NSOperationQueue mainQueue]
                           completionHandler:^(NSURLResponse *response,
                                               NSData *data,
                                               NSError *error) {
                                   if (!error){
                                      //data = 65; for example
                                       block(data);
                                   }
                               }];

    return block(data);  // ???????? This NOT work
}


- (void)viewDidLoad
{
    [super viewDidLoad];

    //
    .......
    //
    double myNewDouble =  [self executeRequestUrlString:fullUrlImage withBlock:^double(double myDoub) {
        return myDoub;
    }];

    // how i can get here variable "myDoub=65" ????

}

3 个答案:

答案 0 :(得分:5)

基本问题是网络请求是异步运行的(即,在方法返回之后,您想要“返回”的值将无法使用),因此您无法像您所概述的那样使用它。你能做到这一点的唯一方法是使请求同步,这是一个非常糟糕的主意。

相反,你应该接受异步模式。特别是不要尝试在double方法之后使用executeRequestUrlString(因为到达那里时你不会检索到值),而是仅在{{withBlock的上下文中使用它。 1}}阻止。所以,把所有代码都放在<{1}} 里面块中:

double

答案 1 :(得分:0)

您正在发送异步请求。这意味着当调用函数早已消失时,您的块将在未来的某个未知时间执行。因此该块不能向被调用的函数返回任何内容。考虑到URL请求可能需要很长时间,如果运气不好,请说一分钟。并且考虑到任何URL请求都可能出错并且根本不会成功。

相反,您的块需要将其收到的任何数据(在将来的某个时间点)传递给想要处理数据的人。通常,块会调用类似

的内容
dispatch_async (dispatch_get_main_queue, ^ () {
    // Here you can do things in a thread-safe way. 
})); 

看起来您尝试创建的方法无法正常工作。

答案 2 :(得分:-2)

如果您想访问块外的变量,则需要添加 __ block 前缀

__block double myDouble

Apple documentation about variables in blocks