ios - 从内部 block 返回方法对象

标签 ios objective-c block uidocument completionhandler

我想知道如何正确执行以下操作:我有一个返回 NSData 对象的方法。它从 UIDocument 中获取 NSData 对象。 NSData 对象可能会变大,因此我想确保它在响应开始之前已完全加载。因此,我想从 block 本身中返回方法的值。所以像这样:

- (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 显然是指 blockreturn

我怎样才能做到这一点而不必使线程阻塞 wait/while 循环?

谢谢。

最佳答案

你不能。接受您尝试执行的操作是异步的这一事实,并将完成 block 参数添加到您的 getMyData 方法中,该方法在调用内部完成处理程序时调用。 (并从方法签名中删除 return):

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

同样的问题存在于swift中,你可以添加一个类似的完成 block :

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

关于ios - 从内部 block 返回方法对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22267865/

相关文章:

iphone - 自定义按钮显示在模拟器上,但不显示在iPhone设备中

ios - 从 AFImageRequestOperation 随机返回的照片

ios - 在 iOS 中将视频文件与其原始音频合并

ios - 在连接的屏幕上显示的内容不会在 Swift 中全屏显示

objective-c - 在 Swift 中计算部分文件的 64 位校验和

objective-c - 检测用户何时触摸表格中的单元格

javascript - 纯 JS - 显示 :block not working

python - 在以 block 读取的字节流中查找模式

c++ - 扩展QTextDocument中 block 的定义

android - 是否有免费的移动应用程序 CMS?