练习:一个发送多个连线的Operation

练习范围

  • NSOperation
  • GCD

练习目标

我们前面在讲block的时候,尝试写过httpbin.org这个服务的SDK(见练习:将Web Service API包装成SDK)。

在前面的练习中,我们每个method 都只会发送一个连线,但是在现实的软体开发过程中,我们往往会想做一些比较复杂的工作,而这样的工作需要发送好几个连线,每个连线之间有相依关系,而这样的工作也可以中途取消,取消的时候,要同时取消所有的连线。

我们现在就要练习写这样的程式。

练习内容

  1. 先拿出我们在 练习:将Web Service API包装成SDK 当中完成的作业。
  2. 写一个叫做HTTPBinManager 的singleton 物件。
  3. 在这个HTTPBinManager 中,增加一个NSOperationQueue 的成员变数
  4. 写一个叫做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 当中执行。
  5. 这个operation要实作 cancel ,发送 cancel 时,要立刻让operation停止,包括清除所有进行中的连线。
  6. HTTPBinManager要加入一个叫做 executeOperation 的method,这个method首先会清除operation queue里头所有的operation,然后加入新的HTTPBinManagerOperation。
  7. HTTPBinManagerOperation 的delegate 是HTTPBinManager。 HTTPBinManager 也有自己的delegate,在HTTPBinManagerOperation 成功抓取资料、发生错误的时候,HTTPBinManager 也会将这些事情告诉自己的delegate。
  8. 撰写单元测试。
  9. 写一个UI,上面有一个按钮与进度条,按钮按下后,就会执行HTTPBinManager的 executeOperation ,然后进度条会显示HTTPBinManagerOperation的执行进度。

results matching ""

    No results matching ""