SwiftArchitectureWithPOP
一个使用 Swift 和协议驱动的基架结构。
安装
使用 CocoaPods
pod 'bais-ios'
# or choose on your need
pod 'bais-ios/Persistance'
pod 'bais-ios/Networking'
pod 'bais-ios/RxExtension'
手动操作
下载 .zip
包,并将 swiftAchitecture/Base
目录复制到您的项目中。
提供内容
网络
-
服务器
提供一个服务器的基本功能,如在线URL、离线URL、isOnline等。在测试模式下,使服务器离线。
#if DEBUG
Server.online = false
#endif
现在您可以为处理响应数据自定义操作,只需从Server
派生并遵守ServerDataProcessProtocol
协议即可。
func handle(data: Any) throws -> Void {
if let dic = data as? [String: Any],
let errorCode = dic["error_code"] as? Int,
errorCode != 0 {
throw NSError(domain: kYourErrorDomain, code: errorCode, userInfo: [NSLocalizedDescriptionKey: message])
}
}
-
ApiManager
现在您可以使用
ApiManager
管理请求,只需从BaseApiManager
派生并遵守ApiInfoProtocol
协议。只需提供一些关于API的信息并设置回调位置,您就已经完成了API的配置。
var apiVersion: String {
get { return "v2" }
}
var apiName: String {
get { return "user/login" }
}
var server: Server {
get { return mainServer }
}
BaseApiManager提供了一些基本方法,例如
public func loadData(with params: [String: Any]?) -> Void
设置用于接收原始数据成功或失败时出错的对象
extension ViewController: ApiCallbackProtocol {
func ApiManager(apiManager: BaseApiManager, finishWithOriginData data: AnyObject) {
if let apiManager = apiManager as? ApiLogin {
print("login success: \n \(apiManager.originData())")
}
}
func ApiManager(apimanager: BaseApiManager, failedWithError error: NSError) {
if apiManager is ApiLogin {
Log.debugPrint("login failed with error: \(error)")
}
}
}
或者使用链式语法
api.loadData(with: nil).response({ (api, data, error) in
if let error = error {
// deal error
}
if let data = data {
// do response if have data
}
})
- Rx支持
ApiManager为您提供了一个Observable
,您可以对它进行转换或将它直接绑定到某个地方。
api.rx.loadData(with: params)
.flatMap {
...
return yourResultObservable
}
.bind(to: label.rx.text)
.dispose(by: bag)
- 注意事项
- 请求由
RequestGenerator
生成,使用Alamofire请求。
持久性
-
数据库
与ApiManager类似,只需从
KMPersistanceDatabase
派生并遵守DatabaseManagerProtocol
协议,提供path
、databaseName
、database
,您已经在项目中创建了一个新数据库。例如。
class DefaultDatabase: KMPersistanceDatabase, DatabaseManagerProtocol {
override init() {
self.databaseName = "default.db"
self.path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first! + "/" + self.databaseName
self.database = FMDatabaseQueue(path: self.path)
super.init()
}
}
-
表和记录
从
KMPersistanceTable
派生并遵守TableProtocol
可以让您在数据库中创建一个新表。任何符合RecordProtocol
的对象都可以记录在您想要的表中。更多详细信息请参见示例。使用方式与以下类似
let table = UserTable()
let newUser = UserModel(name: "Klein", uid: 310)
table.replaceRecord(newUser)
-
获取
使用
DatabaseCommandCondition
按条件获取数据
let table = UserTable()
let condition = DatabaseCommandCondition()
condition.whereConditions = "user_id >= 0"
condition.orderBy = "user_name"
let result = table.queryRecordWithSelect("user_name", condition: condition)
-
高级
总是,数据库提供直接使用SQL进行查询或执行的方法,用于复杂的数据库操作。
let db = DefaultDatabase()
db.query("select * from tableDoesntExtist", withArgumentsInArray: nil)
工具和工具包
- 自定义扩展和类别。
- 与UI相关的类,以便轻松访问全局UI设置。
SystemLog
可以将日志写入文件,并将其存储在沙盒中。
几乎是完成了
>w<!
待办事项
- 网络:取消缓存,将源数据转换为模型或视图数据,请求优先级。
- API管理器中的下载和上传功能。
- 持久性:查询后,将数据转换为模型或视图数据。
动画工具包:类似TextKit的YYText等。(Bais-ios不会提供这些工具,因为基础不应该需要。)- 重构,更函数化和反应性。考虑使用Rx或ReactiveSwift。充分利用泛型。
许可协议
所有源代码均发布在MIT许可下。请参阅LICENSE文件以获取详细信息。