我如何返回变量" 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" ????
}
答案 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)