练习:一个发送多个连线的Operation
练习范围
- NSOperation
- GCD
练习目标
我们前面在讲block的时候,尝试写过httpbin.org这个服务的SDK(见练习:将Web Service API包装成SDK)。
在前面的练习中,我们每个method 都只会发送一个连线,但是在现实的软体开发过程中,我们往往会想做一些比较复杂的工作,而这样的工作需要发送好几个连线,每个连线之间有相依关系,而这样的工作也可以中途取消,取消的时候,要同时取消所有的连线。
我们现在就要练习写这样的程式。
练习内容
- 先拿出我们在 练习:将Web Service API包装成SDK 当中完成的作业。
- 写一个叫做HTTPBinManager 的singleton 物件。
- 在这个HTTPBinManager 中,增加一个NSOperationQueue 的成员变数
- 写一个叫做HTTPBinManagerOperation的NSOperation subclass, HTTPBinManagerOperation使用delegate向外部传递自己的状态。
HTTPBinManagerOperation里头的
main
method依序要执行:- 对我们之前写的SDK发送
fetchGetResponseWithCallback:
并等候回应。 - 如果前一步成功,先告诉delegate 我们的执行进度到了33%,如果失败就整个取消作业,并且告诉delegate 失败。 delegate method 要在main thread 当中执行。
- 对我们之前写的SDK发送
postCustomerName:callback:
并等候回应。 - 如果前一步成功,先告诉delegate 我们的执行进度到了66%,如果失败就整个取消作业,并且告诉delegate 失败。 delegate method 要在main thread 当中执行
- 对我们之前写的SDK发送
fetchImageWithCallback:
并等候回应。 - 如果前一步成功,先告诉delegate 我们的执行进度到了100%,并且告诉delegate 执行成功,并回传前面抓取到的两个NSDcitionary 与一个UIImage 物件;如果失败就整个取消作业,并且告诉delegate 失败。 delegate method 要在main thread 当中执行。
- 对我们之前写的SDK发送
- 这个operation要实作
cancel
,发送cancel
时,要立刻让operation停止,包括清除所有进行中的连线。 - HTTPBinManager要加入一个叫做
executeOperation
的method,这个method首先会清除operation queue里头所有的operation,然后加入新的HTTPBinManagerOperation。 - HTTPBinManagerOperation 的delegate 是HTTPBinManager。 HTTPBinManager 也有自己的delegate,在HTTPBinManagerOperation 成功抓取资料、发生错误的时候,HTTPBinManager 也会将这些事情告诉自己的delegate。
- 撰写单元测试。
- 写一个UI,上面有一个按钮与进度条,按钮按下后,就会执行HTTPBinManager的
executeOperation
,然后进度条会显示HTTPBinManagerOperation的执行进度。