iOS如何从块中获取变量值?

时间:2014-08-18 13:37:16

标签: ios variables block

我可以从块中获取变量值吗?

    - (Params *) getParams {
    __block Params* params = nil;
        //make post, get requests
    [JSONHTTPClient getJSONFromURLWithString:@"http://www.blankspot.ru/api/getinterval"
                                       params:nil
                                      completion:^(id json, JSONModelError *err) {
                                       NSLog(@"json = %@", json);
                                       NSLog(@"Error = %@", err );
                                      NSDictionary* json1 = json;
                                       NSLog(@" %@ ob ", [json1 objectForKey:@"success"]);
                                       params = [[Params alloc] initWithDictionary:json1 error:&err];

                                    NSLog(@"params123 = %@", params); // is not null
                                        }];

    NSLog(@"params123 = %@", params); //this is null
    return params;
   }

在第一个变体NSLog视图中非空值,但块后的第二个变量将为零。

4 个答案:

答案 0 :(得分:2)

这是因为getJSONFromURLWithString是异步的(它使用dispatch_async来进行请求调用)这意味着它将在另一个线程上被调用,而当前线程将继续运行。

您的NSLog显示nil,因为由于调用的异步性质,可能会在达到NSLog行后的某段时间执行该块(因为URL请求需要一些时间才能完成并不是立即的)

答案 1 :(得分:1)

你应该做的是不使用return语句,而是在返回值的位置创建自己的块。像这样:

在.h:

-(void)getParamsSuccess:(void(^)(Params* params))success;

in .m:

-(void)getParamsSuccess:(void(^)(Params *))success; {
    //make post, get requests
[JSONHTTPClient getJSONFromURLWithString:@"http://www.blankspot.ru/api/getinterval"
                                   params:nil
                                  completion:^(id json, JSONModelError *err) {
                                   NSLog(@"json = %@", json);
                                   NSLog(@"Error = %@", err );
                                  NSDictionary* json1 = json;
                                   NSLog(@" %@ ob ", [json1 objectForKey:@"success"]);
                                   Params* params = [[Params alloc] initWithDictionary:json1 error:&err];

                                NSLog(@"params123 = %@", params); // is not null


                                   success(params); // <-- This will call the handler-block with your params-object as the parameter


                                    }];
}

答案 2 :(得分:1)

你的问题是你的完成块是在一些其他动作(例如网络请求)完成后异步执行的(参数名称“完成”应该给你一个线索)。 这意味着行

NSLog(@"params123 = %@", params); //this is null
return params;

将在您的阻止之前执行。此时params 仍然为零。

如果您需要处理收到的数据,您应该在完成块内完成。 另一方面,如果你需要进一步传递接收的参数,你必须创建自己的完成块参数,因为你在其他操作完成后得到你的结果(Param *),而不是立即。

Spoek提出了一个很好的例子,但是不要忘记检查success参数是否为nil,否则当你试图调用它时,你的应用程序就会崩溃。

答案 3 :(得分:0)

使用它:

-(void)getParams:(void(^)(Params *))finishBlock{
    [JSONHTTPClient getJSONFromURLWithString:@"http://www.blankspot.ru/api/getinterval"
                                      params:nil
                                  completion:^(id json, JSONModelError *err) {
                                      NSLog(@"json = %@", json);
                                      NSLog(@"Error = %@", err );
                                      NSDictionary* json1 = json;
                                      NSLog(@" %@ ob ", [json1 objectForKey:@"success"]);
                                      params = [[Params alloc] initWithDictionary:json1 error:&err];
                                      finishBlock(params);
                                      NSLog(@"params123 = %@", params); // is not null
                                  }];
}