大公司是如何优雅地设计 iOS项目 AppDelegate文件的

简介

在大型iOS项目中,AppDelegate 要处理诸多事务,譬如应用初始化、通知、应用生命周期、应用间跳转、scheme处理等等,全部写在
AppDelegate 会导致文件庞大,阅读痛苦、维护困难。非常有必要拆分到不同的类,每个类单独处理一个类别的事务。实现思路也不复杂,可以利用oc的runtime来达到目的,我们可以通过 forwardInvocation 将消息转发到不同的类。

关键代码逻辑

//
//  YUNAppDelegate.m
//  LightAppDelegate
//
//  Created by zhiyunyu on 2018/11/7.
//  Copyright © 2018 zhiyunyu. All rights reserved.
//

#import "YUNAppDelegate.h"
#import "YUNAppDelegateServicesManager.h"
#import 

@interface YUNAppDelegate ()

@end

@implementation YUNAppDelegate

/*
 * 如果不重写respondsToSelector,运行我们app并不会crash,但是会一片漆黑,因为app的入口函数都没有被调用,
 * 系统执行 delegate 的函数的时候,会先通过respondsToSelector询问下能否响应,如果不能响应就不执行了。
 * 所以我们需要重写它,然后追加自己的逻辑,最后系统找不到函数最终就会通过 forwardInvocation 提供一次转发消息的机会
*/
-(BOOL)respondsToSelector:(SEL)aSelector {
    BOOL canRespond = ([self methodForSelector:aSelector] != nil) && ([self methodForSelector:aSelector] != _objc_msgForward);
    if (!canRespond && [[YUNAppDelegateServicesManager appDelegateProtocolMethods] containsObject:NSStringFromSelector(aSelector)]) {
        canRespond = [[YUNAppDelegateServicesManager sharedInstance] servicesCanResponseToSelector:aSelector];
    }
    
    return canRespond;
}

-(void)forwardInvocation:(NSInvocation *)anInvocation {
    [[YUNAppDelegateServicesManager sharedInstance] servicesForwardInvocation:anInvocation];
}

@end

相关技术问题请发邮件:

[email protected]

源码

https://github.com/yuzhiyunAtTencent/LightAppDelegate

你可能感兴趣的:(大公司是如何优雅地设计 iOS项目 AppDelegate文件的)