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

vit*_*kot 10 objective-c

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

也许这是一个愚蠢的问题 - 我刚开始使用ObjC,但是块的真正优势在于"传统"方法?谁能给我一些简短而明确的解释?

DHa*_*ick 28

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

URLConnection* someConnection = [[[URLConnection alloc] initWithURL:someURL] autorelease];
someConnection.delegate = self;
[someConnection start];
Run Code Online (Sandbox Code Playgroud)

然后在你班上的其他地方

- (void)connection:(URLConnection)connection didFinishWithData:(NSData*)
{
    // Do something with the data
}
Run Code Online (Sandbox Code Playgroud)

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

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

此外,假设您的班级中有多个连接都使用相同的委托.现在,您必须在委托方法中区分它们.这可能会使你越多越复杂.使用块,您可以为每个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
    }
}
Run Code Online (Sandbox Code Playgroud)