为了账号安全,请及时绑定邮箱和手机立即绑定

从内部块返回方法对象

从内部块返回方法对象

慕的地6264312 2019-07-13 16:01:38
我想知道如何正确地执行以下操作:我有一个方法,即返回NSData对象。它得到了NSData对象的UIDocument..这个NSData对象可以变大,因此我希望确保在响应启动之前完全加载它。因此,我想从块本身中返回方法的值。所以就像这样:- (NSData*)getMyData {   MyUIDocument *doc = [[MyUIDocument alloc] initWithFileURL:fileURL];   [doc openWithCompletionHandler:^(BOOL success) {     if (success) {       return doc.myResponseData; // this is to be the return for the method not the block     }   }];}这会导致错误,因为return显然是指block氏return.我如何才能做到这一点,而不必让线程阻塞等待/同时循环呢?谢谢。
查看完整描述

3 回答

?
有只小跳蛙

TA贡献1824条经验 获得超8个赞

您不能。接受这样一个事实:您要做的是异步的,并将一个完成块参数添加到您的getMyData方法,该方法在调用内部完成处理程序时调用。(并移除return方法签名):

- (void)getMyDataWithCompletion:(void(^)(NSData *data))completion {
    MyUIDocument *doc = [[MyUIDocument alloc] initWithFileURL:fileURL];
    [doc openWithCompletionHandler:^(BOOL success) {
        completion((success ? doc.myResponseData : nil));
    }];}

在WAST中也存在同样的问题,您可以添加一个类似的完成块:

func getMyData(completion: ((data: NSData?) -> Void) {
    data = ...
    completion(data)}


查看完整回答
反对 回复 2019-07-13
?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

OPEN方法是异步的,这就是为什么您必须在打开完成时提供一个要运行的块。您需要复制它,并使您的方法也收到一段代码,当打开完成时,您将执行这些代码块。

您还应该传递正在包装或创建错误的调用的成功参数,您需要这样做,以便调用代码能够采取正确的操作。

- (void)getMyDataWithCompletion:(void(^)(NSData *data, BOOL success))completion{
  MyUIDocument *doc = [[MyUIDocument alloc] initWithFileURL:fileURL];
  [doc openWithCompletionHandler:^(BOOL success) {
    completion(doc.myResponseData, success);
  }];}



查看完整回答
反对 回复 2019-07-13
  • 3 回答
  • 0 关注
  • 546 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信