在视图控制器之间共享NSURLsession委托实现

时间:2015-09-25 21:53:39

标签: ios objective-c singleton nsurlsession delegation

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

我看到两个解决方案

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

    • 这种方法的缺点似乎是让单身人士难以创建单元测试,完全可以将每个类别的功能从其他类别中分离出来。 I.e.Suppose只发生错误,因为viewcontroler1询问"共享类"发送一个特定的消息跟随viewcontroller 2问它发送一些其他消息。然后使用单元测试无法捕捉到这一点。
  • UIViewController的子类,它实现了我的ViewControllers方法和子类。

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

我很感激任何评论 1.其他人在类似情况下使用的方法 2.上述方法的优点/缺点(包括我在上面列出的2)。我意识到这可能有点主观,但是恕我直言的设计模式得到了很好的建议,与我的代码或用于解决问题X的API有什么关系(甚至更重要)的答案一样重要

1 个答案:

答案 0 :(得分:1)

我过去这样做的方式是:

1)创建了一个包含NSURLSession对象的类     @interface CustomSession:NSURLSessionDelegate     @property(非原子,强)NSURLSession * mySession;

2)在CustomSession init方法初始化mySession,将委托设置为self。

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

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

5)决定是否要将CustomSession用作单例,或者在每次需要时将其实例化。实际上,您可以相应地定义init方法。

+ (CustomSession *)session
{
    //Singleton
}

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

6)对于单元测试,你可以在CustomSession中将一个弱指针指向父VC(正如你所指出的,如果你没有使用Singleton,这将有效。)

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