在Objective-C中使用块的真正优势是什么?

时间:2012-02-12 17:22:07

标签: objective-c

我已经了解了ObjC中的块,语法清晰简单。我几乎可以在任何地方阅读“块是一个很棒的功能,语法是......”。但是,我想念他们使用的真正优势。

也许这是一个愚蠢的问题 - 我刚开始使用ObjC,但是与传统方法相比,块的真正优势是什么?有人可以给我一些简短明确的解释吗?

3 个答案:

答案 0 :(得分:28)

你可以用块做任何事情,你可以不用它们。但它们提供了一种简化代码并使事情更清晰的好方法。例如,假设您有一个URL连接,并希望等待结果。两种流行的方法是提供委托回调或使用块。我将使用虚构的URLConnection类作为示例。

URLConnection* someConnection = [[[URLConnection alloc] initWithURL:someURL] autorelease];
someConnection.delegate = self;
[someConnection start];

然后你班上的其他地方

- (void)connection:(URLConnection)connection didFinishWithData:(NSData*)
{
    // Do something with the data
}

相比之下,当您使用块时,可以在创建连接的位置嵌入被调用的代码。

URLConnection* someConnection = [[[URLConnection alloc] initWithURL:someURL] autorelease];
someConnection.successBlock = ^(NSData*)data {
    // Do something with the data
};
[someConnection start];

此外,假设您的班级中有多个连接都使用相同的委托。现在,您必须在委托方法中区分它们。这可能会使你越多越复杂。使用块,您可以为每个URL连接分配一个唯一的块。

- (void)connection:(URLConnection)connection didFinishWithData:(NSData*)
{
    if(connection == self.connection1)
    {
        // Do something with the data from connection1
    }
    if(connection == self.connection2)
    {
        // Do something with the data from connection2
    }
    if(connection == self.connection3)
    {
        // Do something with the data from connection3
    }
}

答案 1 :(得分:4)

定义“传统方法”?

就个人而言,它看起来更好,因为你可以看到对内联操作的响应是什么,并与操作本身分组。

“传统”回调(这就是我所说的你的意思)方式,将导致必须跳到代码中的其他地方以查看将如何处理和跳回来,而不是仅仅“一起”阅读所有内容

答案 2 :(得分:2)

块的一个优点是它们可以与NSOperationQueues和Grand Central Dispatch一起使用,以比使用NSThread更简单,更有效的方式执行并发操作(假设您使用的是最新版本的iOS / OS X)。

事实上,它们可以以方法无法使其成为Objective-C的强大功能的方式传递。