虽然第一个项目还是2014年那会做的,但同事们都知道我有过iOS项目的经验,公司客户有了iOS版本的需求,自然会想到我来参与这个项目,但具体充当什么角色,我自然是拿不准的,期望来主导,但能力经验又有差距,很微妙的感觉;比方我现在是在架构师的位置上,但在iOS的技能上,却没有充当架构师的能力,如何平衡现实和期望,着实让人纠结的一种状态,重新捡起来,以稍微高一些的视角去定位,还是比之前有了更多的收获 ,尽管由于项目人力配备不齐,正式的iOS开发只有两个,最后可能还是会参与到开发工作中,那就两者都兼顾吧。
打铁还需自身硬,所以还是赶紧把能捡起来的苹果开发相关的技术捡起来!
关于iOS技术,现在有好几个可选的方案来支撑跨平台开发,reactive native、flutter、weex,但由于这个项目Android端产品已经成熟,所以没有考虑使用跨平台的技术来实现,而是直接用iOS原生技术,其实选择Objective-C还是Swift来作为开发语言,确实是拿不准,毕竟苹果官方教程主推的还是Swift,但通过同iOS开发多年经验的同学交流后发现,使用Objective-C作为开发语言的项目,居然不在少数,同事经验中也擅长Objective-C的偏多,所以就选择Objective-C吧。
关于业务架构:
UI
业务模块
基础模块
三方组件库&UIKIT & Fundation API
说明UI与业务模块的关系,以及业务模块的结构描述:
UI界面和业务模块的关系遵循依赖倒置原则,由UI界面声明protocol接口(protocol的声明可以放到业务模块中),然后业务模块去实现protocol。
这里每一个UI模块可以调用一个或者多个对应的业务模块,UI模块的组成:
View + ViewModel的结构,然后ViewModel使用业务模块实现的protocol接口获取到数据,并根据界面层的实现需要进行转换,最后在View显示。
业务模块的组成:Protocol接口+Repository(HTTP Model + DB Model)实现对业务的封装实现。
苹果的应用程序开发,学习曲线并不复杂,从Objective-C语法,到UIkit和Foundation的API,再到Xcode实战开发,UI到业务,再到设计模式,所以整个过程比原来学习的时候还是能顺利的多。
在重新熟悉ObjectC语法的过程中,有几个点之前关注的不多,记录下:
一、Protocol可以用@property形式声明属性,只不过在Protocol中声明的属性,只有对应的setter/getter方法声明,并没有生成对应的成员变量;
@protocol SportProtocol <NSObject>
@property (nonatomic,copy) NSString *sportType;
- (void)playFootball;
- (void)playBasketball;
- (void)run;
@end
#import <Foundation/Foundation.h>
#import "SportProtocol.h"
@interface Person : NSObject<SportProtocol>
@end
#import "Person.h"
@implementation Person
@synthesize sportType=_sportType;
- (void)readSportType{
NSLog(@"%@",_sportType);
}
@end
上面方法中主要用到了@synthesize sportType=_sportType, 意思是说,sportType 属性为 _sportType 成员变量合成访问器方法。
总结
1.@synthesize 的作用:是为属性添加一个实例变量名,或者说别名。同时会为该属性生成 setter/getter 方法。
2.禁止@synthesize:如果某属性已经在某处实现了自己的 setter/getter ,可以使用 @dynamic 来阻止 @synthesize 自动生成新的 setter/getter 覆盖。
3.内存管理:@synthesize 和 ARC 无关。
4.使用:一般情况下无需对属性添加 @synthesize ,但一些特殊情形仍然需要,例如protocol中声明的属性。
二、如何进行UI模块跳转与管理
1、直接跳转:
#模态跳转:一个普通的视图控制器一般只有模态跳转的功能,这个方法是所有视图控制器对象都可以用的。
- (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^)(void))completion
PickImageViewController *ickImageViewController = [[PickImageViewController alloc] init];
[self presentModalViewController:ickImageViewController animated:YES];
//返回
[self dismissModalViewControllerAnimated:YES];
#利用UINavigationController,调用pushViewController,进行跳转;这种采用压栈和出栈的方式,进行Controller的管理。调用popViewControllerAnimated方法可以返回
PickImageViewController *ickImageViewController = [[PickImageViewController alloc] init];
[self.navigationController pushViewController: ickImageViewController animated:true];
[ickImageViewController release];
#带.xib布局文件的viewController之间的跳转
MyViewController *vc = [[MyViewController alloc]initWithNibName:@"MyViewController" bundle:nil];
[self.navigationController pushViewController:vc animated:YES];
#带.storyboard布局文件的viewController之间的跳转
MyViewController *vc = [[UIStoryboard storyboardWithName:@"MyViewController" bundle:nil] instantiateInitialViewController];
[self.navigationController pushViewController:vc animated:NO];
2、非直接跳转,组件隔离方案目前有三种:
- Target-Action 方案,Target-Action方案代表就是`CTMediator`
- URL Router 方案,URL Router 方案代表是蘑菇街的`MGJRouter`
- Protocol-Class 方案,方案最初也是由`MGJRouter`提出的,其为了补足URL Router不能传递特殊参数的问题而设计。不过同样需要注册。
市面上其他的较为出色的中间件方案都是在上面的三个方案基础上发展而来的,包括阿里开源的`BeeHive`及网易开源的`LDBusMediator`。DWMediator则是借鉴了`CTMediator`和`BeeHive`两者的思想实现的Protocol-Class模式的中间件方案。固化了Protocol与Module的对应关系从而实现免注册的模式,然后通过遵循协议的Module完成对第二个组件的调用。通过协议可以避免硬编码来确定方法选择子的问题。
这些组件框架主要出发点是在面对大型应用项目开发时,项目组成员更好的进行协作开发,能遵循固定的代码框架,实现高质量的输出。
-------------------广告线---------------
项目、合作,欢迎勾搭,邮箱:promall@qq.com
本文为呱牛笔记原创文章,转载无需和我联系,但请注明来自呱牛笔记 ,it3q.com