7

次のことを正しく行う方法を知りたい: オブジェクトを返すメソッドがあり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

スレッドをブロックする wait/while ループを作成せずにこれを達成するにはどうすればよいですか?

ありがとう。

4

3 に答える 3

12

できません。実行しようとしていることが非同期であるという事実を受け入れgetMyData、内部の完了ハンドラーが呼び出されたときに呼び出される完了ブロック パラメーターをメソッドに追加します。(そしてreturn、メソッド シグネチャから を削除します):

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

同じ問題が迅速に存在し、同様の完了ブロックを追加できます。

func getMyData(completion: ((data: NSData?) -> Void) {
    data = ...
    completion(data)
}
于 2014-03-08T10:06:46.580 に答える
0

次の Are メソッドは、completedHandler を使用してメソッドを宣言する方法を示しています。

Objective-C

- (void)getMyDataWithCompletionHandler:(void(^)(NSString *str))completionHandler
{
    completionHandler(@"Test");
}

Swift-3

func showDatePicker(superc: UIViewController, completionHandler:@escaping (String) -> Void)  {
            completionHandler("Test")
}
于 2017-07-18T12:20:27.457 に答える