返回方法中的 sendAsynchronousRequest 和 completionHandler

Posted

技术标签:

【中文标题】返回方法中的 sendAsynchronousRequest 和 completionHandler【英文标题】:sendAsynchronousRequest and completionHandler in return method 【发布时间】:2013-11-21 20:01:13 【问题描述】:

completionHandler 完成后如何返回数据?这个方法我试过了,但是报错:

- (NSData *)ReturnDataFromUrl

    NSURLRequest *req = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://example.com"]];

    [NSURLConnection sendAsynchronousRequest:req queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) 

        return data;

    ];

【问题讨论】:

【参考方案1】:

当您说return data; 时,您实际上是在尝试将data 返回给完成块的调用者——这是行不通的。

由于您使用的是异步方法,因此您无法将在块中接收到的数据返回给您开始网络操作的方法。当该块中的代码被调用时,系统已经完成了很长时间的执行那个方法。

您需要做的是设置一个委托系统 - 如果这是一个帮助器类,您可以添加一个协议,包括像 didFinishLoadingStuff:(NSData *)stuff 这样的方法。

你会改变

 - (NSData *)ReturnDataFromURL...

类似

- (void)getDataFromUrlWithDelegate:(NSObject<StuffGetterProtocol> *)delegate...

而不是return data;,你会说:

[delegate didFinishLoadingStuff:data];

当然,在你调用它的任何类中实现委托方法:

- (void)didFinishLoadingStuff:(NSData *)stuff

    //do something with stuff

【讨论】:

以上是关于返回方法中的 sendAsynchronousRequest 和 completionHandler的主要内容,如果未能解决你的问题,请参考以下文章

JS中的方法可不可以有返回值

Access中的VBA返回方法[重复]

这个方法在 groovy 中的返回类型是啥?

13 继续C#中的方法,带返回值的方法介绍

从c#中的方法返回多个值[重复]

java中的构造方法和普通方法