美文网首页iOS程序猿IOSiOS学习笔记
iOS、Swift 基础开发架构思考

iOS、Swift 基础开发架构思考

作者: ImWiki | 来源:发表于2019-05-19 23:29 被阅读125次

    最近在重新学习 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 来实现订阅、通知功能。

    相关文章

      网友评论

        本文标题:iOS、Swift 基础开发架构思考

        本文链接:https://www.haomeiwen.com/subject/igsczqtx.html