4

我对 iOs 开发很陌生,我有点困惑我应该如何分离我的代码以避免巨大的 ViewController.m 文件。目前我的主要视图控制器有很多代表:

@interface ViewController : UIViewController <MKMapViewDelegate, HttpClientDelegate, CLLocationManagerDelegate, NSFetchedResultsControllerDelegate>

我想减少 viewController 代码,我想我应该创建单独的类来处理委托任务。问题是,如果我为 CLLocationManager 创建单例类并让它实现委托方法,那么我如何与视图控制器通信?

假设我的 CLLocationManager 收到位置更新,我如何告诉 viewController 对 UI 进行更改?我应该使用 NSNotificationCenter 发布通知,然后将观察者添加到视图控制器吗?还是让 viewController 像现在一样实现所有委托方法的最佳方法是什么?

4

2 回答 2

1

将其中一些功能移动到您的数据模型中。

鉴于您提供的信息有限,很难说您应该如何管理它,但人们不得不怀疑单个视图控制器是否真的应该管理地图视图跟踪位置管理 HTTP 连接管理核心数据拿来。为什么不将其中的一些移到您的模型中,这样划分成模块会更容易一些?

假设我的 CLLocationManager 收到位置更新,我如何告诉 viewController 对 UI 进行更改?我应该使用 NSNotificationCenter 发布通知,然后将观察者添加到视图控制器吗?

通知将是一个很好的解决方案——它为管理位置的程序部分(同样,这可能属于模型)提供了一种方式来传达更改,而无需了解任何关于程序部分的特别信息关心位置的变化。它还允许一对多的通信——如果你有另一个也关心位置的视图控制器,它可以观察到相同的通知。

还是让 viewController 像现在一样实现所有委托方法的最佳方法是什么?

我尝试考虑适当地划分职责而不是限制代码的大小。如果你有一个类只完成一项工作但需要大量代码来完成它,那很好。如果你有一个类来管理许多不相关的事情,那就不太好了。问题在于,很多工作似乎都落入了视图控制器的传统“管理一屏内容”角色。尝试将管理数据表示的任务(这是视图控制器的正当工作)与管理数据本身(这是模型的工作)分开。

于 2013-09-04T15:46:21.130 回答
0

实现一个负责委托方法的类:

@interface DelegateManager : NSObject <MKMapViewDelegate, HttpClientDelegate, CLLocationManagerDelegate, NSFetchedResultsControllerDelegate>
-(id)initWithViewController:(ViewController*)vc;
@property (weak) ViewController *delegate;
@end

在您的视图控制器中:

@interface ViewController : UIViewController
-(void)doSomething;
@end

在您的 ViewController 中,使用 self 作为参数创建 DelegateManager 的实例。将所有代表的目标设置为您的 DelegateManager。在您的 DelegateManager 的委托方法中,调用[self.delegate doSomething];以与您的 ViewController 进行通信。

于 2013-09-04T15:31:17.493 回答