iphone - iPhone 应用程序中的异步与同步与线程

标签 iphone objective-c cocoa-touch multithreading rest

我正处于一个应用程序的设计阶段,该应用程序将利用 REST Web 服务,并且在使用异步、同步和线程方面有点进退两难。场景如下。

假设您有三个选项可以深入研究,每个选项都有自己的基于 REST 的资源。我可以使用同步请求延迟加载每一个,但这会阻塞 UI 并阻止用户在检索数据时点击后退导航按钮。这种情况几乎适用于任何地方除了当您的应用程序需要登录屏幕时。仅仅因为这个原因,我看不出有任何理由使用同步 HTTP 请求与异步请求。唯一有意义的是让工作线程发出同步请求,并在请求完成时通知主线程。这将防止阻塞。接下来的问题是对您的代码进行基准测试,看看哪个开销更大,是线程同步请求还是异步请求。

异步请求的问题是您需要设置智能通知或委托(delegate)系统,因为您可以在任何给定时间发生对多个资源的多个请求。他们的另一个问题是,如果我有一个类,比如说一个处理我所有数据的单例,我就不能在 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 的邮件应用程序,您会注意到它们在发出第二个请求以检索邮件的前两行(默认)之前首先吸收了您的整个 POP/IMAP 树。

我想我想问各位专家的问题是这样的。什么时候使用异步、同步、线程——以及什么时候在线程中使用异步/同步?您设置了什么样的委托(delegate)系统来知道异步请求完成时要做什么?您是否对异步请求进行优先排序?

对于这个太普遍的问题,有多种解决方案。破解一些东西很简单。问题是,我不想破解,我想要一些简单易维护的东西。

最佳答案

我不会打折异步委托(delegate)调用,但我通常最终会使用带有同步请求的线程工作类。我发现从长远来看,拥有一个定义良好的线程 API 更容易,而不是用管理异步方法之间状态的代码填充 Controller 。您甚至可以在您的工作线程中使用异步方法,尽管通常使用同步方法更容易,除非它们不支持您需要使用的功能。当然,这一切都取决于具体情况,我能想到很多情况下,简单地使用异步方法是最好的途径。

如果你走这条路,一定要考虑 NSOperationQueue;它极大地简化了创建多个工作线程的过程,它还支持操作之间的优先级和依赖性。目前在 10.5 上有一些问题,但我还没有听说在 iPhone 上有任何问题。

关于iphone - iPhone 应用程序中的异步与同步与线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/371638/

相关文章:

objective-c - 如何让 UIToolbar 在静态表格 View 中正确显示?

iphone - 像前后一样用两个摄像头拍照

iphone - 将 Flurry AppCircle 广告与 AdMob 中介集成

iPhone SDK 4.0.2?

iphone - 根据 UIWebView 是否正在加载,事件指示器不显示

objective-c - 压缩代码有什么好处吗?

objective-c - 如何使用 Opengl 或任何其他方法扭曲图像......?

ios - 如何禁用 UITableView 选择?

iphone - initWithNibName VS NSBundle 的 loadNibNamed

cocoa-touch - UISegmentedControl 不随 super View 缩放