Objective-c (iOS) 中常见的 HTTP 请求委托模式
Posted
技术标签:
【中文标题】Objective-c (iOS) 中常见的 HTTP 请求委托模式【英文标题】:Common HTTP request delegate pattern in Objective-c (iOS) 【发布时间】:2011-09-05 13:47:39 【问题描述】:我有一个发出 HTTP 请求的视图控制器“myViewController”。我将请求的代表设置为self
(myViewController 的实例)。一切正常,直到我在请求返回之前将 myViewController 从导航堆栈中弹出。在这种情况下,请求会尝试向已解除分配的 myViewController 发送消息(这会导致我的应用崩溃)。
目前我正在通过在 myViewController 的 dealloc
方法中将所有请求的委托设置为 nil
来修补/解决此问题。 有什么更好的方法来做到这一点?
也许单例可以负责处理所有 HTTP 请求?
【问题讨论】:
【参考方案1】:不久前,我在 UIWebView 委托事件中遇到了同样的问题。解决方案是跟踪您的myViewController
中的所有传出HTTP 请求。因此,请保留一个名为 mutableRequests
的实例变量,您可以在其中添加您发送的每个请求。完成后从该数组中删除请求可能也是一个好主意。
在-viewWillUnload
方法中,简单地枚举mutableRequests
并取消每个请求。这不仅可以让您在释放视图之前取消所有请求,还可以通过在数组中保留所有正在使用的对象来帮助您尊重释放/保留编程模型。
【讨论】:
这种方法可行。很高兴注意取消请求时会发生什么。例如,一些请求可能会向视图控制器发送一条消息,调用 requestCancelled(或类似的)。认为有可能在视图控制器被释放后发送此消息。【参考方案2】:取决于您的视图控制器正在做什么。如果请求仅与该 VC 相关,则执行 Alex 的建议。如果您的应用程序围绕请求(功能的核心部分),您可能会想要那个单例。您可能还需要一个所有视图控制器都实现的通用委托,以便当前视图控制器可以处理您的委托调用。显然,您的请求处理单例将充当您请求的实际委托,并在必要时调用 您的 委托方法。
【讨论】:
以上是关于Objective-c (iOS) 中常见的 HTTP 请求委托模式的主要内容,如果未能解决你的问题,请参考以下文章
iOS开发实用技巧—Objective-C中的各种遍历(迭代)方式