当前位置: 首页 > news >正文

网站可视化编辑Wordpress做个人导航

网站可视化编辑,Wordpress做个人导航,网站首页网址,wordpress 分享本文前言 关于iOS的模块化#xff0c;要追溯到16年接触的BeeHive了#xff0c;BeeHive将功能模块化#xff0c;以module的形式进行构建#xff0c;以performSelector#xff1a;的形式进行module的事件响应#xff0c;以protocol的形式进行module间的通信。可以说思路非常清晰…前言 关于iOS的模块化要追溯到16年接触的BeeHive了BeeHive将功能模块化以module的形式进行构建以performSelector的形式进行module的事件响应以protocol的形式进行module间的通信。可以说思路非常清晰明了了。关于BeeHive的代码传送门alibaba/BeeHivestar已3.2k关于BeeHive源码解析可参考霜神文章传送门BeeHive —— 一个优雅但还在完善中的解耦框架。实际上我并不认为BeeHive可以真正用到我们项目中来它确实构建了module但是module实例带来的内存问题会让人头疼。个人认为将BeeHive思想中的module部分改造一下用在我们的AppDelegate中是完全可行的。下面进入正文。 目录 一、模块拆分 二、模块事件响应 三、模块管理 1.模块注册 2.触发event 3.移除module 四、总结 一、模块拆分 画了一个结构图module1到module4为我们需要在Appdelegate中进行处理的业务逻辑比如说我们的数据库处理分享功能推送功能等等。 首先为所有模块定义了三个接口 protocol SHRMAppEventModuleProtocol UIApplicationDelegate- (NSInteger)moduleLevel; - (void)destroyModule; - (NSString *)moduleID;end 复制代码接口定义了三个函数moduleLevel返回module执行的优先级destroyModule用来对module进行释放moduleID返回当前module的id。接口的默认实现统一在BaseAppEventModule中进行。BaseAppEventModule为所有module的父类只有继承了BaseAppEventModule的module才能被管理。 关于BaseAppEventModule的默认实现也很简单对module进行销毁的时候用到了SHRMAppEventModuleManager下面会讲到优先级默认设置100. interface SHRMBaseAppEventModule : NSObject SHRMAppEventModuleProtocolend#define MODULE_LEVEL_DEFAULT 100 implementation SHRMBaseAppEventModule- (NSInteger)moduleLevel {return MODULE_LEVEL_DEFAULT; }- (void)destroyModule {[[SHRMAppEventModuleManager sharedInstance] removeModule:[self moduleID]];NSLog(% destroy,NSStringFromClass([self class])); }- (NSString *)moduleID {return NSStringFromClass([self class]); }end 复制代码模块的创建上面说到了必须要继承自SHRMBaseAppEventModule只有继承了SHRMBaseAppEventModule的module才会被管理因为只有SHRMBaseAppEventModule遵循了SHRMAppEventModuleProtocol协议。关于module创建部分 interface testMudule : SHRMBaseAppEventModule endimplementation testMudule- (NSInteger)moduleLevel {return 1; }- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {[self initMudule];[self destroyModule];return YES; }- (void)initMudule {NSLog(testMudule init); }end 复制代码application: didFinishLaunchingWithOptions:函数的实现展示了一个module的整个生命周期从创建到销毁的过程,那么application: didFinishLaunchingWithOptions:是怎么响应的实际上module的头文件并没有暴漏任何接口到这里就实现了功能的模块化。那为什么还能执行到这里这要感谢强大的runtime函数performSelector下面讲一下我对module事件响应的处理。 二、模块事件响应 还是以上面的application: didFinishLaunchingWithOptions:函数为例它是怎么来的很明显这是AppDelegate里面的APP生命周期回调 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {[[SHRMAppEventModuleManager sharedInstance] handleApplicationEvent:selector(application:didFinishLaunchingWithOptions:)Complete:^(id _Nonnull module, SEL _Nonnull sel) { #pragma clang diagnostic push #pragma clang diagnostic ignored -Warc-performSelector-leaks[module performSelector:selwithObject:applicationwithObject:launchOptions]; #pragma clang diagnostic pop}];return YES; } 复制代码没看错这样一搞AppDelegate的application: didFinishLaunchingWithOptions:就剩这些了这样一来所有实现了application: didFinishLaunchingWithOptions:的modlue都会被调用调用优先级根据接口定义的moduleLevel返回值确定。到这里我们就完成了AppDelegate瘦身的工作实际上AppDelegate中的其他回调处理是一样的。当然还有一个很重要的没有说就是SHRMAppEventModuleManager做了什么通过上面的结构图能够看到SHRMAppEventModuleManager是个中间件用来处理module与AppDelegate间的关系。下面说到第三部分模块管理。 三、模块管理 SHRMAppEventModuleManager为一个单例提供了三个接口 /**初始化所有的AppDelegate相关的Event Modules*/ - (void)registedAllModules;/**触发event module处理AppDelegate回调事件param eventSel AppDelegate 回调事件消息param complete module处理handle*/ - (void)handleApplicationEvent:(SEL)eventSelComplete:(void(^)(id module,SEL sel))complete;/**移除module对象param moduleID module ID*/ - (void)removeModule:(NSString *)moduleID; 复制代码1.模块注册 模块注册的思路是完全按照BeeHive的思想来的在编译期就将我们的module通过__attribute函数进行注册。在运行期再将我们注册好的module取出来在registedAllModules中进行实例化按照level的返回值进行排序存储。__attribute函数具体做了什么可以参考我之前的文章写一个易于维护使用方便性能可靠的Hybrid框架三—— 配置插件关于插件注册部分的解释。 2.触发event handleApplicationEvent:Complete:为module事件响应的核心函数 - (void)handleApplicationEvent:(SEL)eventSelComplete:(void(^)(id module,SEL sel))complete {NSMutableArray *tmpAppEventModules [[NSMutableArray alloc] initWithArray:self.appEventModules];for (idSHRMAppEventModuleProtocolmodule in tmpAppEventModules){if ([module conformsToProtocol:protocol(SHRMAppEventModuleProtocol)]){if ([module respondsToSelector:eventSel]) {if (complete) {complete(module,eventSel);}}}} } 复制代码if ([module respondsToSelector:eventSel])就会执行complete将module和sel返回也就是到了AppDelegate里面继而执行module的sel函数并且将参数传递过去。 3.移除module module的移除在AppDelegate里面我们将程序启动之后调用完就不再使用的功能module会手动执行移除操作。这也是前言所说的BeeHive在module移除这一块会稍显复杂但是在AppDelegate里面我们是完全可以知道哪些module在加载之后可以立即移除的另外我们仅在AppDelegate中进行模块化产生的module实例也会非常少so完全没必要担心module所带来的内存开销问题。 - (void)removeModule:(NSString *)moduleID {NSInteger index NSNotFound;NSInteger resIndex 0;for (idSHRMAppEventModuleProtocolmodule in self.appEventModules){if ([[module moduleID] isEqualToString:moduleID]){index resIndex;break;}resIndex;}if (index ! NSNotFound) {[self.appEventModules removeObjectAtIndex:index];} } 复制代码总结 最后总结一下关于模块化现在总体来看比较流行也有很多介绍模块化组件化具体实施之路的文章都很优秀也值得学习。关于解耦我更倾向于protocol的方式接口protocol化代码易读且清晰。之前看过mrpeak在组件化方面的文章传送门iOS 组件化方案个人觉得protocolversion的方案和BeeHive非常像protocol解耦version进行module的版本管理但是还是没有解决module所带来的内存开销问题module一旦细化何时销毁也是让开发者头疼的问题。先说这么多各位小伙伴有任何问题欢迎评论区讨论。 最后附上DEMO传送门AppDelegateMudule欢迎star?。
http://www.zqtcl.cn/news/805457/

相关文章:

  • 网站制作完工验收单软件开发模型有哪几种
  • saas建站平台源码wordpress 安装主题 无法创建目录
  • 兰州做高端网站做网站学什么专业
  • dedecms 图片网站模板wordpress省市联动
  • pw域名网站杭州建站官网建设
  • 河北省建设厅网站官网网站js时间代码
  • 网站开发实现编码深圳做网站专业
  • 网站建设电子合同h5网站开发多少钱
  • 邓州做网站投票网站做seo如何
  • 环保网站建设项目备案系统免费虚拟主机空间
  • 网站实现语言转换技术上该怎么做免费下载网页模板
  • 云南网站建设专业品牌网站建设电子商务
  • 保健食品东莞网站建设莱芜金点子信息港交友
  • 小程序视频网站开发网站开发项目预算表
  • 邢台手机网站建设价格iis 手机网站
  • 网站开发流程三大部分微信学校网站模板
  • 网站推荐正能量专业做网站多少钱
  • 网站界面设计总结淘客手机端网站建设
  • 天津网站建设zhy88宁波企业黄页公司黄页
  • 个人网站课程设计报告app免费制作软件中文版
  • 品牌建设网站规划盛唐网站建设
  • 商城网站系统建站平台上建设的网站可以融资吗
  • 怎么查网站空间wordpress快速入门
  • 长沙 网站运营德国服务器网站
  • 有动效网站建网站的书籍
  • 网站模版更新公告2023年ppt模板免费
  • 广饶网站建设北京建设工程监督网站
  • 长沙网站建设电话郑州网站空间
  • 做网站是怎样赚钱的网页制作工具按其制作方式有
  • 网站地图在哪里展现电子商务网站需要做那些准备工作