Swift

HBKit-Swift 框架说明

2017-06-09  本文已影响0人  MaxCong

1. HBKit 来源

HBKit最早由HuobanKit演变而来,我将HuobanKit中跟业务无关的代码抽离出来,精简成基本的网络框架和数据库(CoreData)框架,对MVVM架构设计方案清晰分层,并结合VIPER、Riblets架构设计思路引入Router路由,组成:网络、数据库、路由三个体系。可以以极简的方式来使用,并让ViewController间解耦。并由Swift进行代码重写,一个全新Swift框架。
而HuobanKit则以后由业务model组成,负责业务的数据与服务器交互。

目前本框架还没有公布出来,尚需进一步完善

1.1 网络部分

网络请求部分针对Alamofire进行二次封装,
提取出可以方便快捷使用的网络请求GET/ POST/ PUT/ DELETE的四种方法

1.2 数据库部分

采用apple原生CoreData作为基础数据库,提供数据增、删、查(改)的动作,
并支持Api属性对应数据entity模型的驼峰命名法的匹配:如user_id => userId

1.3 路由部分

采用url网络链接写法,基于url进行拆分并提取出class/function?params进行ViewController窗口的初始化

2. 用法

2.1 发起网络请求

2.1.1 GET

// 接口域在HBKitConfig.swift HBApiURL中设置
let request = HBRequest.GETRequestWithPath(path: "/uri")
request.completion { [unowned self] (error:NSError?, response:HBResponse) in
    if error != nil {
        print("faild to request, error :", error)
    } else {
        print("response:", response)
    }
}
request.send()

2.1.2 POST

var parameters: Dictionary = Dictionary<String, Any>()
parameters["username"] = "username"
parameters["password"] = "password"

let request:HBRequest = HBRequest.POSTRequestWithPath(path: "/auth", parameters: parameters)
request.completion { (error:NSError?, response:HBResponse) in
    if error != nil {
        print("faild to request, error :", error)
    } else {
        print("response:", response.body as Any)
    }
}
request.send()

2.1.3 MultiRequest

// 基于GET请求将send方法添加参数packer: HBMultiRequestPacker.shared
request.send(packer: HBMultiRequestPacker.shared)

// 并由HBMultiRequestPacker类send
HBMultiRequestPacker.shared.send()

2.2 数据库

2.2.1 网络请求入库

2.2.1.1 如何根据接口返回数据构建数据表?

ItemModel

itemId (Integer 64)

name (String)

public class ItemModel:NSManagedObject, HBManagedObject {
    static func identityPropertyNames() -> [String] {
        return ["itemId"]
    }
}

2.2.1.2 如何将接口数据存入CoreData?

{"item_id": 10000, "name": "测试Item"}
// 网络请求返回值片段...
request.completion { [unowned self] (error:NSError?, response:HBResponse) in
    if error == nil {
        // response.body = {"item_id": 10000, "name": "测试Item"}
        let body = response.body as! Dictionary
        let itemModel = ItemModel.hb_createObjectOrUpdate(fromDictionary:  body, isSave: true)
    }
}
/* 
response.body = [
                        {"item_id": 10000, "name": "测试Item0"},
                        {"item_id": 10001, "name": "测试Item1"},
                        {"item_id": 10002, "name": "测试Item2"}
                    ]
*/
// 网络请求返回值,入库片段
request.completion { [unowned self] (error:NSError?, response:HBResponse) in
    let body = response.body as! [Dictionary]
    let itemArray:Array = ItemModel.hb_createObjectsOrUpdate(fromArray:  body,
                     isSave: true, 
                     step: { (itemModel:ItemModel, index:Int) in
        // 单步执行,可以改造数据等
    }, completion: { 
        // 注意completion还可以做其他事情,比如Array循环结尾的回调      
    })!
}

2.2.2 数据库数据查询

public class ItemModel: NSManagedObject, HBManagedObject {
    static func identityPropertyNames() -> [String] {
        return ["itemId"]
    }
    
    static func queryModel(itemId:Int64) -> ItemModel? {
        let result:Array = self.hb_getObjects(predicate: NSPredicate.init(format: "itemId=%ld", itemId))
        if result.count > 0 {
            return result.first
        }
        return nil
    }
}

2.2.3 数据库数据删除

let itemModel = ItemModel.queryModel(itemId:10000)
itemModel.delete()

2.2.4 数据库数据修改和保存

let itemModel = ItemModel.queryModel(itemId:10000)
itemModel.name = "change the name"
itemModel.save()

2.3 Router 路由解耦

2.3.1 声明一个可用于HBRouter路由的HBBaseViewController

protocol HBBaseViewController {
    static func createViewController() -> UIViewController
}
class ItemViewController: UIViewController, HBBaseViewController {
    var itemId:NSNumber? = nil
    
    // 基于HBBaseViewController协议,声明createViewController,方便HBRouter
    static func createViewController() -> UIViewController {
        //这里采用从StoryBoard来获取一个UIViewController
        return self.instantiateViewControllerFromStoryboard(name: "Item")
    }
    
    override func viewDidLoad() {
    }
}
HBRouter.shared.push(path: "huoban://item", params: ["item_id": NSNumber.init(value: 10000)])

当然我们也可以通过?item_id=10000传参

HBRouter.shared.push(path: "huoban://item?item_id=10000")
var itemViewController = ItemViewController.createViewController()
itemViewController.itemId = NSNumber.init(value:10000)
self.navigationController.pushViewController(itemViewController)

2.4 OBServable(订阅被观察者Block)

2.4.1 HBKit/Extension/Observable.swift 是被观察者

//ViewModel
class ItemViewModel {
    var itemName = Observable<String>("")
    init (_ itemId:Int) {
        // itemId......do something
    }
    
    func requestNetworkData() {
        itemName <- "refresh new name!"
    }
    func requestNetworkData2() {
        itemName <- "refresh new name2!"
    }
}

// ViewController
class ItemViewController {
    var itemViewModel = ItemViewModel(10000)
    @IBOutlet weak var itemNameLabel: UILabel!
    
    itemViewModel.itemName.subscribe{ [unowned self] (oldValue, newValue:Bool) in
        self.itemNameLabel.text = newValue
    }

    itemViewModel.requestNetworkData()
    itemViewModel.requestNetworkData2()
}

2.5 工程目录结构推荐

Project

Core

Common

HBKit

Data

ItemModel.swift

Model

ItemAgent.swift

Module

Item

Item.storyboard

ItemList

ItemListViewController.swift


3. HBKit 目录结构

上一篇 下一篇

猜你喜欢

热点阅读