iOS 项目架构问题思考

思考架构小问题

1. AppDelegate 臃肿,

比如

@class PTVNetworkStatus;
@class PTVUserAccount;
@class PublishConfig;
@class PXYDataMgr;
@class PBTHostInfoManager;
@interface AppDelegate : UIResponder 

@property (strong, nonatomic) UIWindow *window;

@property (strong, nonatomic) PTVUserAccount * userAccount;

@property (strong, nonatomic) PTVNetworkStatus* networkStatus;

@property (strong, nonatomic) PublishConfig* publishConfig;

@property (strong, nonatomic) PXYDataMgr* xyDataMgr;

@property (strong, nonatomic) PBTHostInfoManager* hostInfoManager;
@end

#define GetAppDelegate ((AppDelegate *)[[UIApplication sharedApplication] delegate])

同样的问题,在

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

中还有一些初始化操作。。

根据官方的文档,appdelgate 中应该只做和app状态相关的事情。

放在Appdelegate 中,其实就相当于一个全局的单例。在每个需要用到的地方会使用appdelegate 的单例去获取。

在 didFinishLaunchingWithOptions 中做初始化,第一会影响启动速度,第二,会显得很臃肿。

解决方法

如果真要在app 启动完成之后做初始化操作,可以箭筒响应的通知,比如:

+ (void)load
{
    __block id observer =
    [[NSNotificationCenter defaultCenter]
     addObserverForName:UIApplicationDidFinishLaunchingNotification
     object:nil
     queue:nil
     usingBlock:^(NSNotification *note) {
         ///做初始化操作
         balabalbalblablablalbblaablb
         ///
         [[NSNotificationCenter defaultCenter] removeObserver:observer];
     }];
}

同样完成了对应的操作。有很多东西,要变成一个单例的时候,我们应该考虑是否需要,如果在单一的地方才使用的,就不用做单例了,浪费内存,也不好维护!

2 直播间页面代码逐渐在增大。

我们目前的直播间页面代码都在3000 行左右了。代码不太容易阅读和维护。

问题就出在,我们不断的在做各种活动,活动的有效期很短,导致代码量增大。不同的功能,view的管理权限都在controller 中.

解决方案

不同的功能分开管理,管理方式可以是类簇,比如

@interface PBTPublishViewController(活动1)
@end

@interface PBTPublishViewController(活动2)
@end


@interface PBTPublishViewController(活动3)
@end


@interface PBTPublishViewController(活动4)
@end


然后在不同的分类中 hook viewDidLoad 方法,添加自己的view,让活动实现selfManage.

这样子活动可以不侵入本身的代码。

第二种解决方案,不使用分类,每个活动或者功能模块,自己定义一个 Manage 类来实现 selfManage。

比如:


@interface XXXPKManage : NSObject

@property (nonatomic, weak) UIView *superView;

- (id)initWithSuperView:(UIView 
*)superView;

-(void)start;
@end

其实很多功能,只是需要一个superView 就可以了。然后在 controller 中管理一个 XXXPKManage 就可以了。这样子可以拆分出去好多代码。

3 单例随着功能增加而增加。

现在进入直播间,最少十几个单例,这个数字随着功能的增加还在不断的扩张。

解决方案

能不用单例就不用单例,比如,网络请求,肯定是某个场景需要就跟某个场景绑定就好了,

使用过多的单例模式,会导致内存暴涨,而且,单例模式如果是保存一次性状态的,还要反反复复清空状态。

4 对象之间的交互方式,

看个代码感受一下:

@interface PBTPublishViewController ()

view 要向 拥有者发消息的时候,不一样要使用这么多的delegate,可以适当的考虑block,或者响应连的方式。参考

https://casatwy.com/responder_chain_communication.html

5 NSNotificationCenter 有点多。

NSNotificationCenter 提供了跨模块交互的能力,所以应该适当的考虑下,如果这个功能只是这个模块需要的,就不用使用 NSNotificationCenter 这种方式了, delegate 或者 target/action 的方式会比较好点

你可能感兴趣的:(iOS 项目架构问题思考)