【问题标题】:sendAsynchronousRequest and completionHandler in return method返回方法中的 sendAsynchronousRequest 和 completionHandler
【发布时间】:2023-04-07 18:25:01
【问题描述】:

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;

    }];
}

【问题讨论】:

    标签: xcode methods nsurlconnection sendasynchronousrequest completionhandler


    【解决方案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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-09
      • 1970-01-01
      • 2019-03-23
      • 2018-01-13
      • 2017-07-27
      相关资源
      最近更新 更多