2011-03-25 54 views
2

我需要对http服务器异步运行查询并处理响应。查询真的是一个相当大的方法调用链,回调。这增加了复杂性,因为在调用链中有很多返回路径。如何可靠地管理后台请求?

直到当前的请求完全完成,才能启动新的请求。

这里的大致轮廓:

  1. 一些线程调用[Foo poll]
  2. poll方法启动一些在后台运行的HTTP请求。在这种情况下,ASIHTTPRequest。
  3. 这些请求最终会调用[Foo onRequestComplete]来解析响应。在错误[Foo onRequestError]被调用。这是第二个返回路径。
  4. 然后通过回调和更多返回路径对服务器进行更多调用。
  5. 最终将一些东西保存到磁盘。
  6. 的调查是完全

这里是收集:在这些步骤中,调用poll应该被忽略(返回)或阻塞,直到调查完成。

在另一轮询正在运行时,如何确保poll功能块或无操作?

+2

一个非常幼稚的做法是增加一个'Server.isBusy'属性,但不是线程安全的,非常杂乱维护,考虑错误处理路径等。关于GCD,块或同步? – 2011-03-25 20:36:40

+0

锁定或GCD - http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Multithreading/ThreadSafety/ThreadSafety.html#//apple_ref/doc/uid/10000057i-CH8-SW1 – Joe 2011-03-25 20:46:35

回答

2

只需使用NSLock

[Foo poll]

if ([lock tryLock]) { 
    // Do your stuff 
} 

[Foo onRequestComplete]

[lock unlock]; 
+0

这是一个有点凌乱来维护。你需要在整个地方添加“lock”和“unlock”调用(基本上在每个可能的返回路径中,回调等)。我有一种恼人的感觉,应该是更简化的方法,可能使用GCD,但我看不到它。令人沮丧。 – 2011-03-26 14:14:13

+0

@Martin Wickman:你提出问题的方式,听起来就像你有一个入口和一个回调。您可能会在回应请求失败时回复,但这仍然只是您需要考虑锁定的三个地方。如果你有足够的返回路径来使这个锁解决方案难以维护,也许是返回路径的数量是问题而不是锁? – 2011-03-26 17:41:04

+0

这更多的是由一系列(http,parse,http,http,...,保存到磁盘,完成)组成的事务。有一个锁定入口点,但每一步都有自己的回调,这使得在某个地方很容易错过“解锁”。但除非没有别的办法,否则我猜这就是答案。 – 2011-03-28 08:54:54