2012-12-01 40 views
0

从私有库中,我使用了这样的块函数,但不知道它们是如何实际创建的。他们将如何返回到我的班级并执行该块?Objective-c:创建块函数

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
//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>); 
    } 
} 

化妆对象的CALSS,并使用你不需要睡它不会让控制通至该块被执行

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

    } 
       errorCallback:(void (^)(NSString *errorMsg)) errorCallback{ 
//get your error value 
    }]; 
+0

这将成功阻止控制前进 – amar

+0

我已经传递了字符串,你可以传递任何东西 – amar

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); 
     } 
    }); 
}