0

プライベート ライブラリから、このようなブロック関数を使用していますが、実際にどのように作成されているのかわかりません。彼らはどのように私のクラスに戻り、ブロックを実行しますか?

ImAnotherClass *sameObj = [[ImAnotherClass alloc] init];

[sameObj testFunctionWithBlock:^(BOOL success, NSError *error) 
{
    if(!error)
    NSLog(@"you'll only read this, once test function was done!");
}];

[sameObj release];

ここで注目すべき点は、test関数が実行を完了するのにかなりの時間 (分単位) がかかる可能性があることですが、ブロック内の行を完全に出力することです! 私の関数でさえすでに実行されています。

4

2 に答える 2

4
//your class .h
 + (void) doSomething:(NSString *) string
                   successCallback:(void (^)(id successValue)) successCallback
         errorCallback:(void (^)( NSString *errorMsg)) errorCallback;


//your class.m
+ (void) doSomething:(NSString *) string
                   successCallback:(void (^)(id successValue)) successCallback
         errorCallback:(void (^)( NSString *errorMsg)) errorCallback {

   //do your work here
   //set your bool for error

    if(error) {
        errorCallback(<error value>);
    } else {


        successCallback(<value on success>);
    }
}

あなたのカルスのオブジェクトを作成し、あなたがスリープを必要としないことを使用すると、ブロックが実行されるまで制御が渡されません

 [objYourClass  doSomething:(NSString *) string
                           successCallback:(void (^)(id successValue)) successCallback{
    //get your success value

    }
                 errorCallback:(void (^)( NSString *errorMsg)) errorCallback{
//get your error value
    }];
于 2012-12-01T08:15:54.263 に答える
0

関数が内部でどのように実装されているか疑問に思っている場合は、次のようになります。

- (void) doSomethingWithCompletion: (dispatch_block_t) completion
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        sleep(10); // wait for ten seconds
        if (completion) {
            dispatch_async(dispatch_get_main_queue(), completion);
        }
    });
}
于 2012-12-01T08:01:09.913 に答える