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

在Objective-C中使用块的真正优势是什么?,objective-c,Objective C,我已经学习了ObjC中的块,语法清晰简单。我几乎到处都能读到“块是一个很好的特性,语法是……”。然而,我错过了使用它们的真正优势 也许这是一个愚蠢的问题——我刚刚开始使用ObjC,但与“传统”方法相比,块的真正优势是什么?有谁能给我简单明了的解释吗?定义“传统方法” 就个人而言,最好是看到一个块,因为您可以看到对操作的响应将是什么,并与操作本身进行内联和分组 “传统”回调方式(我想你是这个意思)将导致必须跳转到代码中的其他地方,以查看如何处理某些内容并跳回,而不仅仅是“一起”读取所有内容。可以使

我已经学习了ObjC中的块,语法清晰简单。我几乎到处都能读到“块是一个很好的特性,语法是……”。然而,我错过了使用它们的真正优势

也许这是一个愚蠢的问题——我刚刚开始使用ObjC,但与“传统”方法相比,块的真正优势是什么?有谁能给我简单明了的解释吗?

定义“传统方法”

就个人而言,最好是看到一个块,因为您可以看到对操作的响应将是什么,并与操作本身进行内联和分组


“传统”回调方式(我想你是这个意思)将导致必须跳转到代码中的其他地方,以查看如何处理某些内容并跳回,而不仅仅是“一起”读取所有内容。

可以使用块执行的任何操作都可以不使用它们。但是,它们提供了一种很好的方法来简化您的代码并使事情变得更干净。例如,假设您有一个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];
- (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
    }
}
此外,假设您的类中有多个连接,所有连接都使用同一个委托。现在,您必须在委托方法中区分它们。这可能会变得复杂,你有更多的。使用块,您可以为每个URL连接分配唯一的块

URLConnection* someConnection = [[[URLConnection alloc] initWithURL:someURL] autorelease];
someConnection.successBlock = ^(NSData*)data {
    // Do something with the data
};
[someConnection start];
- (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
    }
}

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


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

感谢您的热烈响应!我想我现在可以看到它的优点了。有趣的是——如果我理解正确的话,它还允许我们在执行异步连接时避免同步,对吗?可能与传统方法重复也是的,我指的是回调。块的可重用性是什么?我可以读取它,可以将它存储到变量中,就像指向函数的指针一样。指向块的指针和指向函数的指针有什么区别?还有一个跳跃,或者这是一个不好的练习?非常简单的解释和容易理解..谢谢。。你能给我详细的解释吗。。。