假设我有这样的代码:
[ApiConnection getServerTimeWithBlock:^(BOOL gotTimeResponse){
if(gotTimeResponse)
{
//we're online, got the response from time endpoint
[ApiConnection registerNewCustomerWithBlock:^(NSString* val){
if(val)
{
NSLog(@"val: %@",val);
}
else
{
NSLog(@"no val");
}
}];
}
else
{
//we're offline
}
}];
NSLog(@"TEST");
为什么在整个第一个块完成执行之前执行了最后一个NSLog?
答案 0 :(得分:4)
因为getServerTimeWithBlock:
方法是异步的,所以它立即返回并在后台线程上运行。当该线程完成时,调用完成块。
因此,该方法在您的日志之前运行,但是完成块(通常)不会(如果出现错误或其他类似的话)。
答案 1 :(得分:2)
据推测,getServerTimeWithBlock:
是异步的。在提供块时,您将告诉APIConnection对象在完成获取服务器时间后要执行的操作。这将涉及网络提取和读取数据,您不希望在主线程上等待,因为这将导致您的UI冻结。因此,您的程序继续运行,并且只要获取完成就会执行该块。
请注意,块并不意味着正在使用异步或多线程代码(例如,参见NSArray的enumerateWithBlock:方法),但这似乎很可能就是这种情况。