1

我目前正在考虑我的 iOS 应用程序的数据模型。该应用程序仅从服务器接收信息,因此“模型”本身通常会执行所有网络请求,......
但是,这些网络请求必须在后台执行 - 我的意思是另一个任务,而不是 iOS 后台state - 请求完成后,必须更新应用程序中的信息。

编写一个委托来通知控制器是否更有意义,或者我也可以使用 NSNotificationCenter?我认为基于 NSNotification 的解决方案可以使模型更加通用,例如在桌面应用程序中。
也许,我应该补充一点:模型(因为它保存了一些会话信息)是单例的,所以基于委托的常规方法不起作用......

4

2 回答 2

1

我认为使用单独的线程来处理通信不是一个好主意。除了复杂之外,它没有必要,因为NSURLConnection/NSURLRequest它允许您异步处理通信,即没有阻塞。

详细地说,您可以创建一个NSURLRequest执行:

NSURLRequest* yourReq = [NSURLRequest requestWithURL:yourURL];

然后创建一个NSURLConnection

NSURLConnection* yourConnection = [NSURLConnection connectionWithRequest:yourReq delegate:yourDelegate];

并开始:

[yourConnection start];

数据准备好后,将调用您的委托(connectionDidFinishLoading:connection:didFailWithError:)的方法之一,以便您可以更新 UI。

这一切都没有阻塞。

一个更好的替代 usingNSURLConnection/NSURLRequest是使用ASIHTTPRequest,它在内存管理方面似乎更具弹性,并且还提供了一个很好的缓存机制。

编辑:如果你担心你的模特是单身,你不能有代表,让我建议你进一步研究这个问题。

您的模型可能是单例,而您的请求的委托可能与模型无关,除了知道如何访问它(这对于单例模型来说非常简单)。

这可以通过使用 的几种机制来实现NSURLConnection,但是如果使用ASIHTTPRequest,它会变得非常容易,因为每个机制都ASIHTTRequest可以有自己的委托。

于 2011-05-26T15:27:42.133 回答
0

委托解决方案确实有效,建议使用。它看起来像:

[[DataLayer sharedInstance] fetchDataWithDelegate:self];

该方法可以产生一个后台线程并响应主线程上的委托。

于 2011-05-26T15:03:23.640 回答