【问题标题】:NSNotification-based iOS App基于 NSNotification 的 iOS App
【发布时间】:2011-05-26 14:59:04
【问题描述】:

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

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

【问题讨论】:

    标签: ios delegates model nsnotification


    【解决方案1】:

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

    具体可以创建NSURLRequest执行:

    NSURLRequest* yourReq = [NSURLRequest requestWithURL:yourURL];
    

    然后创建一个NSURLConnection

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

    然后开始:

    [yourConnection start];
    

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

    所有这些都没有阻塞。

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

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

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

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

    【讨论】:

    • 谢谢,我现在实际上正在使用这样的 NSURlConnection :D 这个 ASIHTTPRequest 看起来真的很棒,因为我也在我的应用程序中下载大文件......
    • 您应该始终在单独的线程中处理通信,否则 UI 将在通信期间冻结。唯一的问题是您是自己生成线程还是让 API 为您完成。
    • @chrischw_de 我也可以推荐 ASIHTTPRequest。
    • @Erik B:异步 I/O 由操作系统通过中断处理。这破坏了使用线程来避免阻塞的必要性。非阻塞行为是中断所固有的。这里有更多详细信息:en.wikipedia.org/wiki/Asynchronous_I/O#Signals_.28interrupts.29
    • @chrischw_de:如果您认为由于您的模型是单例而无法使用委托,请参阅我的编辑。
    【解决方案2】:

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

    [[DataLayer sharedInstance] fetchDataWithDelegate:self];
    

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

    【讨论】:

    • 好的,谢谢。但总的来说,把这样的模型做成Singleton并没有错,对吧?
    • 在我使用过的几乎所有应用程序中,我们都使用单例类作为数据层的入口点。我不认为这有什么问题。我确实知道有些人通常认为单例是一件坏事,但我认为它没有问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    • 2021-01-23
    • 2016-02-08
    相关资源
    最近更新 更多