大公司是如何优雅地设计 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 <objc/message.h>

@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

相关技术问题请发邮件:

zhiyunyu@tencent.com

源码

https://github.com/yuzhiyunAtTencent/LightAppDelegate

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容