猿问

从内部块返回方法对象

我想知道如何正确地执行以下操作:我有一个方法,即返回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显然是指blockreturn.

我如何才能做到这一点,而不必让线程阻塞等待/同时循环呢?

谢谢。


慕的地6264312
浏览 547回答 3
3回答

有只小跳蛙

您不能。接受这样一个事实:您要做的是异步的,并将一个完成块参数添加到您的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)}

慕尼黑8549860

OPEN方法是异步的,这就是为什么您必须在打开完成时提供一个要运行的块。您需要复制它,并使您的方法也收到一段代码,当打开完成时,您将执行这些代码块。您还应该传递正在包装或创建错误的调用的成功参数,您需要这样做,以便调用代码能够采取正确的操作。- (void)getMyDataWithCompletion:(void(^)(NSData *data, BOOL success))completion{   MyUIDocument *doc = [[MyUIDocument alloc] initWithFileURL:fileURL];   [doc openWithCompletionHandler:^(BOOL success) {     completion(doc.myResponseData, success);   }];}
随时随地看视频慕课网APP
我要回答