【问题标题】:Sharing NSURLsession delegate implementation among view controllers在视图控制器之间共享 NSURLsession 委托实现
【发布时间】:2015-12-23 19:36:35
【问题描述】:

在我的 iOS 应用程序中,许多 ViewController 需要根据用户输入和操作从服务器发送/接收数据。我将使用 NSURLSession 进行所有的网络活动。但我不想让每个 ViewController 都符合 NSURLSession 委托 协议并重复所有方法。

我看到了两种解决方案

  • 创建一个符合 NSURLSession 委托的类 协议。其他类创建此类的实例并使用其方法从服务器发送/接收数据。处理所有网络的类的重用将使用单例设计模式通过重载其 init 方法来完成,以便仅创建它的实例。

    • 这种方法的缺点似乎是使用单例很难创建单元测试,这些单元测试完全使每个类的功能与其他类隔离。即假设仅发生错误是因为 viewcontroler1 要求“共享类”发送特定消息,然后 viewcontroller 2 要求它发送其他消息。然后不可能使用单元测试来捕捉它。
  • 实现方法的 UIViewController 的子类和我的 ViewControllers 的子类。

    • 这里的一个问题是,如果我在应用程序中有不同类型的视图,那么我需要使用 NSURL 会话委托方法为每种类型的 ViewController 创建子类。而且我必须小心地将委托对象从一个方法分配到另一个方法。当我看到它时,我认为这种方法也存在与方法 1 相同的单元测试问题。

我将不胜感激任何 cmets 1. 其他人在类似情况下使用的方法 2.上述方法的优缺点(包括我上面列出的2种)。我意识到这可能有点主观,但恕我直言,在设计模式上获得好的建议与回答我的代码有什么问题或使用哪个 API 来解决问题一样重要(甚至更重要)X

【问题讨论】:

  • “创建一个符合 NSURLSession 委托协议的类”。如果一次只能激活一个连接和/或在视图控制器被销毁后连接应该继续,则使其成为单例。否则,每个视图控制器都可以使用该类的单个实例。
  • 谢谢,因为用户可能会发送一个文件,然后 a) 将应用程序置于后台或 b) 移动到应用程序中的另一个屏幕,我认为最好采用单例方法。但我看到了一些关于单身人士是一件坏事的可怕事情。恕我直言,sassed 的可测试性问题似乎也适用于其他方法。所以,我想我可能会选择这个。

标签: ios objective-c singleton nsurlsession delegation


【解决方案1】:

我过去这样做的方式是:

1) 创建了一个包含 NSURLSession 对象的类 @interface 自定义会话:NSURLSessionDelegate @property (nonatomic, strong) NSURLSession *mySession;

2)在CustomSession的init方法中初始化mySession,设置delegate为self。

3) 在 CustomSession 中实现了所需的 NSURLSession 委托方法。

4) 使用块方法(可选,但我更喜欢它们)

5) 决定是要将 CustomSession 用作单例还是在每次需要时实例化它。实际上,您可以同时执行这两种操作,只需相应地定义 init 方法即可。

+ (CustomSession *)session
{
    //Singleton
}

+ (instancetype) newClient{
    //normal init method}

6) 至于单元测试,您可以在 CustomSession 中有一个指向父 VC 的弱指针(正如您所指出的,如果您不使用单例,这将起作用)。

快速建议:使用 AFNetworking,将简化您的生活。例如,我使用 AFHTTPSessionManager 和提供的相应块方法: [self GET:detailsURL parameters:parameters success:^(NSURLSessionDataTask *task, id responseObject)

【讨论】:

  • 谢谢@codinpora。由于用户可以发送/请求文件 & a) 将应用程序置于后台或 b) 移动到应用程序中的另一个屏幕,我不需要单例方法。你有什么办法吗?我正在考虑 AFNetworking,但也想以“艰难的方式”学习 SDK,以防 AFNetworking 没有公开的灵活性。使用 AFNetworking,我看到您只需要为“成功”或“失败”时执行的内容提供块,他们如何处理用户从一个屏幕移动到另一个屏幕的事情?采用它会更好地编写更好的单元测试代码吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-10
  • 2018-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多