测试已测试 | ✓ |
语言语言 | SwiftSwift |
许可协议 | MIT |
发布最后发布 | 2017年1月 |
SwiftSwift 版本 | 3.0 |
SPM支持 SPM | ✗ |
由 Rajat Talwar 维护。
这是一个简单的依赖项,用于将通过网络调用获取的所有数据(无论是服务器上的还是本地存储上的)转换为类对象。
iOS 8.0 及以上
数据存储库套件通过 CocoaPods 提供。要安装它,请在Podfile中指定它
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'
target 'TargetName' do
pod 'DataStoreKit'
end
然后,运行以下命令
$ pod install
数据存储库套件基于两个高级协议
此协议强制存储类实现所有基本功能,例如查询、获取、设置、删除、添加(表示POST)。
public protocol ModelProtocol:class {
func query(params params:[String:AnyObject]?, options:[String:AnyObject]?, callback: ModelArrayCallback? )
func get(id id:String?,params:[String:AnyObject]?, callback: ModelObjectCallback? )
func put(id id:String?,object:ObjectCoder, callback: ModelObjectCallback? )
func add(object:ObjectCoder, callback: ModelObjectCallback? )
func remove(id id:String?,params:[String:AnyObject]?, callback: ModelObjectCallback? )
}
public typealias ModelArrayCallback = (NSError?,NSArray?)->Void
public typealias ModelObjectCallback = (NSError?,AnyObject?)->Void
在上面的协议中,params:[String:AnyObject] 是在指定后的URL中查询参数,例如: https://www.example.com/messages?from_user_key=1234567890&to_user_key=0987654321
此协议强制执行将您的Swift对象转换为[ expansions:
public protocol ObjectCoder:class{
init(dictionary withDictionary:[String:Any])
func toDictionary() -> [String:Any]
static func identifierKey() -> String
}
数据存储库套件帮助处理两种类型的网络调用
要进行服务器调用,首先需要实现ObjectCorder协议的类。例如,以下Message类
import Foundation
import DataStoreKit
class Message:ObjectCoder {
var id:String?
var from_user_key:String?
var to_user_key:String?
var message:String?
var created_ts:Double? //created timestamp in Double
var type:String?
static func identifierKey() -> String {
return "id"
}
required init(dictionary withDictionary:[String:Any]){
self.id = withDictionary["id"] as? String
self.from_user_key = withDictionary["from_user_key"] as? String
self.to_user_key = withDictionary["to_user_key"] as? String
self.message = withDictionary["message"] as? String
self.tyoe = withDictionary["type"] as? String
var created_ts_str = withDictionary["created_ts"] as? Double
self.created_ts = created_ts_str
}
func toDictionary() -> [String:Any] {
var dic = [
"id" : self.id ?? "",
"from_user_key" : self.from_user_key ?? "",
"to_user_key" : self.to_user_key ?? "" ,
"message": self.message ?? "" ,
"type": self.type ?? "",
"created_ts" : self.created_ts ?? NSDate().timeIntervalSince1970
]
return dic
}
}
在这里,当需要将数据存储在本地存储中并唯一标识它时,使用identifierKey()函数。在这个例子中,id 是唯一标识符。
现在,您需要有一个Restify Model可以执行Message类的网络调用。
let messsageUrl = "http://api.mysite.com/messages"
let model = Restify<Message>(path: messsageUrl, networkClient: MyNetworkClient()) // see note below to know about MyNetworkClient
}
MyNetworkClient 是一个实现 ModelProtocol 的类(实现 GET、PUT、POST、DELETE),这样就可以使用您选择的任何网络库
现在,您已准备好调用服务器并检索数据。您现在可以执行以下服务器请求:
let paramsDic: [String:Any]? = [“from_user_key”: “1234567890”, “to_user_key”:”0987654321”]
model.query(params: paramsDic, options: nil, callback: { (error:NSError?, results:Any?) in
// Do with results
})
上述网络调用的结果将是一个包含消息的对象数组,这些消息的 from_user_key 为 1234567890,to_user_key 为 0987654321。
上面的代码用于查询两个用户之间的数据。同样,您也可以使用 GET、PUT、ADD、REMOVE。
使用 DataStoreKit,您可以将 Message 类对象存储在本地存储中,并且您也可以在本地存储上做出所有 REST 调用。
请确保您在项目中有一个名为 MyApp.xcdatamodeld 的 xcdatamodel 文件,并且已定义了一个名为“Message”的实体,其字段根据您的 Message.swift 类定义(请参阅上文)。
现在,既然我们已经为网络调用创建了模型,我们也可以为本地存储的调用创建一个模型。
let messageModel: CoreDataStore?
do {
let context = try CoreDataFactory.coreDataStack.context()
return CoreDataStore<Message>(entityName: "Test", managedContext: context)
} catch let error as NSError {
let memoryContext = try! CoreDataFactory.inMemoryDataStack.context()
messageModel = CoreDataStore<Message>(entityName: "Test", managedContext: memoryContext)
}
现在,您可以准备对本地存储进行调用并获取数据。现在,您可以执行以下对本地存储的请求:
let paramsDic: [String:Any]? = [“from_user_key”: “1234567890”, “to_user_key”:”0987654321”]
messageModel.query(params: paramsDic, options: [:], callback: { (error:NSError?, results:Any?) in
// Do with results
})
DataStoreKit 还支持在本地存储上进行复杂查询。以下是一个此类查询的示例:
let patamsDic: [String:Any]? = ["created_ts >=": 1437108600]
messageModel.query(params: paramsDic, options: [:], callback: { (error:NSError?, results:Any?) in
// Do with results
})
此查询将返回一个消息数组,其中 created_ts 大于等于 1437108600。此类复杂查询也可以使用小于等于 <=, 小于 < 和大于 >。
Rajat Talwar,[email protected]
DataStoreKit 在 MIT 许可证下提供。有关更多信息,请参阅 LICENSE 文件。