我对iOs开发很新,我有点困惑,我应该如何分离我的代码以避免巨大的ViewController.m文件。目前我的主视图控制器有很多代表:
@interface ViewController : UIViewController <MKMapViewDelegate, HttpClientDelegate, CLLocationManagerDelegate, NSFetchedResultsControllerDelegate>
我想减少viewController代码,我想我应该创建单独的类来处理委托任务。问题是,如果我为CLLocationManager创建单例类并让它实现委托方法,那么我该如何与视图控制器进行通信?
假设我的CLLocationManager收到位置更新,如何告诉viewController更改UI?我应该使用NSNotificationCenter发布通知,然后将观察者添加到视图控制器吗?或者是让viewController实现所有委托方法的最佳方法是什么?
答案 0 :(得分:1)
将部分功能移至数据模型中。
由于您提供的信息有限,很难说您应该如何管理这一点,但是人们不得不怀疑单个视图控制器是否应该真正管理地图视图和跟踪位置和管理HTTP连接和管理核心数据提取。为什么不将其中的一部分移到您的模型中,哪些部分更容易划分为模块?
让我们说我的CLLocationManager收到位置更新,怎么做 我告诉viewController对UI进行更改?我应该用吗? NSNotificationCenter发布通知然后添加观察者 视图控制器?
通知是一个很好的解决方案 - 它为程序中管理位置的部分提供了一种方法(同样,这可能属于模型)来传达变更,而不必特别了解任何部分。关心位置变化的程序。它还允许一对多通信 - 如果您有另一个也关心位置的视图控制器,它可以观察到相同的通知。
或者是让viewController实现所有委托方法的最佳方法吗?
我试着考虑适当地划分责任而不是限制代码的大小。如果你有一个班级做一个工作,但需要很多代码才能做到这一点,那很好。如果你有一个班级管理许多不相关的事情,那就不太好了。麻烦的是,许多工作似乎属于传统的管理屏幕内容和#34;视图控制器的作用。尝试将管理数据表示(这是视图控制器的合法工作)的任务与管理数据本身(这是模型的工作)分开。
答案 1 :(得分:0)
实现一个负责委托方法的类:
@interface DelegateManager : NSObject <MKMapViewDelegate, HttpClientDelegate, CLLocationManagerDelegate, NSFetchedResultsControllerDelegate>
-(id)initWithViewController:(ViewController*)vc;
@property (weak) ViewController *delegate;
@end
在ViewController中:
@interface ViewController : UIViewController
-(void)doSomething;
@end
在ViewController中,使用self作为参数创建DelegateManager实例。将所有委托的目标设置为DelegateManager。在DelegateManager的委托方法中,调用[self.delegate doSomething];
与ViewController进行通信。