iOS 开发之block 和delegate

这里是关于block和delegate的使用的一些讨论。内容来自群:iOS编程艺术(群号:20002102)

闭包:可以捕获外部变量的匿名函数

用block可以把发起回调前的局部变量捕获住 如果处理回调的时候需要发起时的局部变量 用block很自然就可以实现 如果用notification或者observer的话,就需要专门去维护这些局部变量

block能够抓取局部变量的特性是其它所有方式都无法做到的,符合这个特性的场景就是block的最佳使用场景。抓取局部变量的本质其实就是获得相关变量的命名域,所以,在跨命名域调度的时候,由于命名域先天不完整,所以就不得不使用block作为载体去传递处理逻辑。典型的场景就是组件化时候的跨组件调用。
嗯,所以关键点就在于调用者和响应者之间命名域是否覆盖完整。这也是objc.io那幅图的缺陷,它并没有涉及到这部分问题

虽然底层不知道上层,但是上层是知道底层的。如果是组件化场景,调用方不知道被调用方 被调用方也不知道调用方 那就非block不可 是的,主要就是利用了闭包能够抓取上下文的特性。

你觉得网络库用delegate比用block的优势在哪? 调试过程你必须要找到着陆点 “找到着陆点”这一步如果用的是block,就很花成本了 着陆点统一的后果就是一个类里面如果有好几个apimanager requestSucceed里面一堆if else 使用strategy模式的话,那就一个ifelse都没有了 着陆点说的就是你请求放飞出去回来,接收的地方 block捕获上下文的功能在网络库这一层发挥不出优势啊
这其实相当于:大家在进行帆船比赛,然后你的帆船不光能在海里开,还能当风筝在天上飞。但问题是:帆船比赛不需要你在天上飞啊。。。 block就是那个可以当风筝飞的帆船
你要说这个帆船可以当风筝,好不好?当然好,功能强大啊 但是在这个比赛场景里面,体现不出优势啊

因为block的隐式抓取局部变量,其本质是代码对上下文的耦合。delegate由于显式抓取,就能够使得任意对象都可以脱离业务上下文来完成任务 这种场景下使用delegate的话就可以做到避免3000行viewcontroller的情况

comments powered by Disqus