我可以从块中获取变量值吗?
- (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视图中非空值,但块后的第二个变量将为零。
答案 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
}];
}