2015-09-25 73 views
0

在我的iOS应用中,许多ViewController需要根据用户输入和操作发送/接收来自服务器的数据。我将为我所有的网络活动使用NSURLSession。但我不想让每个ViewController都符合NSURLSession委托协议并重复所有的方法。在视图控制器中共享NSURLsession委托实现

我看到了两个解决方案

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

    • 这种方法的缺点似乎是单身人士使得创建单元测试非常困难,因为单元测试完全可以将每个类的功能与其他人隔离开来。 I.e.Suppose一个错误只发生,因为viewcontroler1问“共享类”发送一个特定的消息跟随viewcontroller 2问它发送一些其他消息。那么使用单元测试是不可能的。
  • UIViewController的子类,它实现了我的ViewControllers的方法和子类。这里

    • 的一个问题是,如果我有各种不同的意见的应用程序,那么我就需要用NSURL会议委托方法每种视图控制器的创建子类。我必须谨慎地将方法分配给委托对象。当我看着它,我觉得这种方式也有同样的单元测试问题,方法1.

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

+1

“创建一个符合NSURLSession委托协议的类”。如果一次只有一个连接可以处于活动状态,并且/或者在视图控制器被销毁后应该继续连接,则将其设置为单例。否则,每个视图控制器可以使用该类的单个实例。 – Gruntcakes

+0

谢谢,因为用户可能会发送一个文件,然后a)将应用程序放入后台或b)移动到应用程序中的另一个屏幕,我认为最好采用单例方法。但是我看到一些关于单身人士是坏事的可怕的东西。恕我直言,所测试的可测试性问题似乎也适用于其他方法。所以,我认为我可能会这样做。 –

回答

1

这样,我已经在过去这样做是:

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

2)在CustomSession init方法初始化MySession的,委托设为自我。

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

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

5)决定是否要使用CustomSession作为一个单身或每次你需要它的时候实例化。实际上你可以只是相应地定义init方法。

+ (CustomSession *)session 
{ 
    //Singleton 
} 

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

6)作为单元测试,你可以在CustomSession父VC弱指针(正如你所指出,这将如果你不使用一个Singleton工作)。

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

+0

谢谢@codinpora。由于用户可以发送/请求文件和a)将应用程序放在后台或b)移动到应用程序中的另一个屏幕,我不需要单独的方法。你看到任何方式吗?我在考虑AFNetworking,但也想在“灵活的方式”下学习SDK,以防AFNetworking无法提供灵活性。通过AFNetworking,我发现你只需要给出“成功”或“失败”时要执行的内容块,他们如何处理用户从一个屏幕移动到另一个屏幕等情况?采用它会更好地编写更好的单元测试代码吗? –

相关问题