我正在设计应用程序的阶段,该应用程序将使用REST Web服务,并且在使用异步与同步与线程之间存在困难。这是场景。iPhone应用程序中的异步与同步与线程
假设您有三种深入的选择,每种都有自己的基于REST的资源。我可以用同步请求延迟加载每个请求,但这会阻止用户界面,并阻止用户在检索数据时碰到后退导航按钮。这种情况几乎适用于,除了,当你的应用程序需要登录屏幕。由于这个原因,我看不出有任何理由使用同步HTTP请求。唯一有意义的是让工作线程发出同步请求,并在请求完成时通知主线程。这将阻止该块。接下来的问题就是在代码中标记代码,看看哪些代码有更多开销,线程同步请求或异步请求。
异步请求的问题是您需要设置智能通知或委托系统,因为您可以在任何给定时间对多个资源发生多个请求。他们的另一个问题是如果我有一个类,比如说一个处理所有数据的单例,我不能在getter方法中使用异步请求。这意味着下面的不会去:
- (NSArray *)users {
if(users == nil)
users = do_async_request // NO GOOD
return users;
}
,而以下几点:
- (NSArray *)users {
if(users == nil)
users == do_sync_request // OK.
return users;
}
您也可以享有优先权。我的意思是优先考虑的是,如果您查看iPhone上的Apple的Mail应用程序,您会注意到他们首先会删除整个POP/IMAP树,然后再次请求检索邮件的前两行(缺省值)。
我想我的问题给你的专家是这样的。何时使用异步,同步,线程 - 以及何时在线程中使用异步/同步?当异步请求完成时,您已经设置了什么样的委派系统来知道该怎么做?您是否优先处理异步请求?
对于这个太常见的问题,有一个解决方案的色域。破解一些东西很简单。问题是,我不想破解,我想要一些简单易维护的东西。
斯蒂芬,我认为一个状态机和队列将帮助我吨。我假设你在任何地方都没有例子? – Coocoo4Cocoa 2008-12-16 16:18:29
“状态机”是对它进行表述的一种相当宏伟的方式......它是一些布尔和一些switch语句。没有什么非常聪明的,但我发现预先绘制在一张纸上是有用的。队列只是一个NSMutableArray。 – 2008-12-16 22:46:14