为什么在此之前执行任何代码?

时间:2014-04-25 12:34:27

标签: objective-c asynchronous objective-c-blocks

假设我有这样的代码:

[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?

2 个答案:

答案 0 :(得分:4)

因为getServerTimeWithBlock:方法是异步的,所以它立即返回并在后台线程上运行。当该线程完成时,调用完成块。

因此,该方法在您的日志之前运行,但是完成块(通常)不会(如果出现错误或其他类似的话)。

答案 1 :(得分:2)

据推测,getServerTimeWithBlock:是异步。在提供块时,您将告诉APIConnection对象在完成获取服务器时间后要执行的操作。这将涉及网络提取和读取数据,您不希望在主线程上等待,因为这将导致您的UI冻结。因此,您的程序继续运行,并且只要获取完成就会执行该块。

请注意,块并不意味着正在使用异步或多线程代码(例如,参见NSArray的enumerateWithBlock:方法),但这似乎很可能就是这种情况。