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 回答