iOS、Swift 基础开发架构思考

814 阅读4分钟
原文链接: www.jianshu.com

最近在重新学习 Swift,开始总结基础架构,如何搭建一个高效的架构呢,这个一个值得思考的问题。

网络请求:Moya + RxSwift + ObjectMapper

Swift有非常基础的开源网络请求库 Alamofire ,可以满足开发者基本的网络请求诉求,但是需要我们处理很多细节,所以就有了基于 Alamofire 封装的 Moya,Moya的架构设计得很不错,当然也有他不足的地方,但是Moya的拓展性很强,可以很好和RxSwift、ObjectMapper结合,就可以构建非常好用的的网络请求库,特别是基于 REST API。
基于Moya、RxSwift和ObjectMapper优雅实现REST API请求

provider.rx.request(.user(userId:"101"))
        .mapObject(type:User.self)
        .subscribe(onSuccess: { user in
            print(user.name)
        }, onError: { error in
            print(error)
        })
图片缓存:Kingfisher

Kingfisher 是非常优秀的图片缓存框架,非常值得使用。

let url = URL(string: "https://example.com/image.png")
imageView.kf.setImage(with: url)
关系数据库:Realm

苹果官方有CoreData,但是我觉得 CoreData 非常的重,特别是对刚入门的开发者不友好,学习成本高,我个人是非常不喜欢。FMDB 也是有很多的开发者选择,我没有使用过,这里不做推荐,感兴趣的自己尝试下是否好用。我推荐使用 Realm ,这个数据库不是基于SQLite,是基于C语言编写的,提供Java、OC、Swift、.NET、Javascript语言API,性能非常好,而且提供很方便的工具,简单易用,非常值得使用。

开发模式:MVVM

iOS 开发中最常见的是 MVC(Model-View-Controller) 开发模式,前几年 MVP(Model-View-Presenter) 也是非常的流行,但是 MVP 其实并不适合移动开发,理想很美,看似代码分离,实际上各种回调、双向依赖让开发变得更加复杂而且难以维护。移动开发其实更加最近 MVVM(Model-View-ViewModel) 开发模式,以方面可以做到各层的业务代码分离,而且也不至于让代码变得太复杂,而且抽离出来的ViewModel层也可以重用。


image.png
RxSwift

Rx 开发思路已经在 Android 开发中应用非常广泛,应用到了方方面面,RxJava在一个成熟的Android APP 中已经是不可或缺的框架,比如网络请求、图片上传、图片下载、权限申请等。Rx 开发思想也慢慢地在 iOS 开发中流行起来,我个人是非常推荐把 RxSwift 作为 iOS 开发的基础框架。
RxSwift、RxBlocking初尝试

UI 编写

iOS 开发中,常用有三种编写UI的方式:storyboard、xib、纯代码,官方是非常推荐使用storyboard,但是storyboard有个非常痛苦的问题就是代码的合并,一旦两个人同时修改同一份storyboard文件,合并代码就带来了噩梦。如果是多人协同办公,还是建议使用纯代码编写UI。但是纯代码编写UI是非常的慢,改完必须运行才能看到。个人开发可以考虑多个storyboard文件,不同的业务流程使用不同的storyboard,避免所有的业务都放在一个storyboard里面。当然我们也可以考虑使用xib的方式编写,单个页面放在一个xib文件,甚至多个开发也可以选择使用xib。

简单数据存储

我们在开发过程中,会有大量的简单键值对存储需求,用于保存一些简单的信息或者登录的状态等。我们可以选.plist、NSUserDefaults、 NSKeyedArchiver 作为简单的数据存储。个人建议使用NSUserDefaults+ObjectMapper搭配,简单易用。
Swift基于NSUserDefaults、NSKeyedArchiver 存储简单键值对数据

JSON 解析

简单的JSON解析可以用SwiftyJSON ,如果是对象解析个人推荐使用ObjectMapper 作为JSON的解析库,非常简单好用。

SwiftyJSON

let json = JSON(jsonObject)
// Getting a string from a JSON Dictionary
let name = json["name"].stringValue

ObjectMapper

class User: Mappable {
    var username: String?
    var age: Int?
    var friends: [User]?                        // Array of Users
    required init?(map: Map) {}
    func mapping(map: Map) {
        username    <- map["username"]
        age         <- map["age"]
        friends     <- map["friends"]
    }
}
let user = User(JSONString: JSONString)
let JSONString = user.toJSONString(prettyPrint: true)
关于单元测试

身边好多 iOS 的朋友似乎对单元测试并不敏感,基本不怎么会用到单元测试。在我看来,单元测试是非常有价值的开发思想,虽然UI做单元测试没有什么价值,但是在做Model层的开发时候,就非常有用了,我们并不需要启动APP即可完成逻辑的调试,非常方面,建议我们做开发务必需要思考,我们编写的代码是否可测试,这个也可以提高我们的编码质量。

事件总线(观察者消费者模式)

可以使用 NSNotificationCenter 来实现订阅、通知功能。