Objective c 块能否通过目标C中的协议替换委托模式?

Objective c 块能否通过目标C中的协议替换委托模式?,objective-c,design-patterns,delegates,objective-c-blocks,Objective C,Design Patterns,Delegates,Objective C Blocks,我是一个普通的iOS开发者。我看到大量使用的第一个设计模式是委托模式,它主要用于回调功能 既然Objective C中有了块,我看到越来越多的库大量使用它们并避免委托,我想知道,块是否是委托模式使用协议的永久替代品 我最近在一个项目中使用了MKNetworkKit,我在它上面创建了一个包装类,这个库是基于块的,所以我所有封装对其中一个基于块的代码的调用的代码都变成了另一个基于块的代码 我发现最初它非常方便,但调试和修改起来很困难,因为代码看起来很复杂(回调内部回调内部回调!) 关于何时使用什么和

我是一个普通的iOS开发者。我看到大量使用的第一个设计模式是委托模式,它主要用于回调功能

既然Objective C中有了块,我看到越来越多的库大量使用它们并避免委托,我想知道,块是否是委托模式使用协议的永久替代品

我最近在一个项目中使用了MKNetworkKit,我在它上面创建了一个包装类,这个库是基于块的,所以我所有封装对其中一个基于块的代码的调用的代码都变成了另一个基于块的代码

我发现最初它非常方便,但调试和修改起来很困难,因为代码看起来很复杂(回调内部回调内部回调!)


关于何时使用什么和某些最佳实践的任何提示?

协议及其与之交谈的指定对象与通常用于封装任务和/或将其发送给GCD的协议有很大不同

我确实在苹果的Block文档中看到了一个与学员提供的一些功能相匹配的地方:

块作为回调特别有用,因为块携带 回调时要执行的代码和回调期间需要的数据 那次处决


协议和与之交谈的指定协议与协议大不相同,后者通常用于封装任务和/或将任务发送给GCD

我确实在苹果的Block文档中看到了一个与学员提供的一些功能相匹配的地方:

块作为回调特别有用,因为块携带 回调时要执行的代码和回调期间需要的数据 那次处决


委托和块都用于“回调”结果,通常用于创建结果的对象。有一些区别:

  • 使用委托协议,您必须实现以接收回调的方法名称是固定的。这意味着,如果需要使用相同的委托协议接收来自多个可能操作的回调,则必须以某种方式区分它们。对于块,没有固定的名称;只需传递带有特定签名的块对象。可以将不同的块对象传递给不同的动作
  • 委托协议通常(但不总是)包含多个回调方法,例如“成功”和“失败”回调。每个块只能用作一个回调。许多库试图通过使用多个参数将多个委托回调“组合”到单个块回调中,例如,块有两个参数(result,error),其中如果“error”为nil,则对应于原始的“success”回调,“result”为数据;如果“error”不是nil,则它对应于原始的“failure”回调。另一个选项是分别为操作提供多个块(例如,它具有“成功块”属性和“失败块”属性,您可以设置)。这是一种更为通用的方法,它可以作为委托协议的一对一替换,使用任意数量的方法
  • 内存管理:委托通常是弱引用的,因为委托通常是拥有委托者的“父”对象。但是,块是被强烈引用的,因为块是一种用途,一旦传递给委托人就不再需要了。然而,如果你想一想,其实并没有什么不同。对于委托,委托方法通常会对自身(父对象)执行一些操作。对于块,为了做到这一点,块将需要对“父对象”的引用。然后,该引用需要是弱引用,以模拟委托模式的内存管理。对于块,父对象代码可以更好地控制委托将如何引用它,因为它设置了块

总之,可以系统地将任何使用委托协议的API转换为使用块的API,正如我前面所述——对于每个委托方法,在委托器上添加一个块属性。

委托和块都用于“回调”结果,通常用于创建结果的对象。有一些区别:

  • 使用委托协议,您必须实现以接收回调的方法名称是固定的。这意味着,如果需要使用相同的委托协议接收来自多个可能操作的回调,则必须以某种方式区分它们。对于块,没有固定的名称;只需传递带有特定签名的块对象。可以将不同的块对象传递给不同的动作
  • 委托协议通常(但不总是)包含多个回调方法,例如“成功”和“失败”回调。每个块只能用作一个回调。许多库试图通过使用多个参数将多个委托回调“组合”到单个块回调中,例如,块有两个参数(result,error),其中如果“error”为nil,则对应于原始的“success”回调,“result”为数据;如果“error”不是nil,则它对应于原始的“failure”回调。另一个选项是分别为操作提供多个块(例如,它具有“成功块”属性和“失败块”属性,您可以设置)。这是一种更为通用的方法,它可以作为委托协议的一对一替换,使用任意数量的方法
  • 内存管理:委托通常是弱引用的,因为委托通常是拥有委托者的“父”对象。但是,块是被强烈引用的,因为块是一种用途,一旦传递给委托人就不再需要了。然而,如果你想一想,其实并没有什么不同。对于委托,委托方法通常会对自身(父对象)执行一些操作。具有