异步回调方式的讨论
很多时候需要异步操作来避免阻塞当前线程,而异步操作的结果需要通过回调告知调用者,而回调的方式有多种,且不同语言支持的情况也不一样。
回调机制是在某个时间发生前准备好的一段代码,事件一旦发生,系就会执行相应的代码。因此回调有两个主要部分组成:(1)注册过程 (2)事件发生时需要执行的代码。
实现回调机制的途径有一下几大类:
1.注册对象和回调方法
(1)目标-动作对:异步调用时,简单保存目标对象指针和其回调处理方法的指针,当异步操作结束后,被调用对象会通过二者找到回调的入口,并执行回调。
(2) 委托机制:只需要保存目标对象的指针,而目标对象肯定实现了回调协议,即其回调处理方法是唯一的,明确的,因此仅通过目标对象,就能找到回调接口。当某个对象收到多个事件并要求同一个对象来处理所有的事件时,就可以使用委托机制了。
(3)通告机制:类似于设计模式中的观察者模式(订阅者-发布者模式),多个监听对象中,每个对象都有一个回调入口(目标-动作对),他们监听的同一个异步事件,当异步完成时,它们会被一一回调。当需要多个对象(或者两个无关的对象)处理同一事件时,可以使用通告机制。
2.继承回调类
我们可以创建类A继承一个回调类(接口),并实现指定的回调方法,那么类A的对象就可以作为回调对象,这样在异步调用的时候不用注册对象和方法,而是直接传入一个回调对象即可。这种方式虽然在注册过程中方便,但是在准备回调代码时麻烦,因为不同类型的回调都要创建一个新类,导致代码膨胀。
3.注册时实现回调
此方式只是在使用回调的方式与其他几种不同,即允许你在调用异步接口的同时编写回调处理代码,即整合了回调的注册过程和准备回调代码的过程。这种方式适合处理简单快速的回调任务,帮助开发者写出短小精炼的代码。已知Object-C中的Block机制和Java中回调机制支持此方式。