数据存储库套件 3.0.6

数据存储库套件 3.0.6

测试已测试
语言语言 SwiftSwift
许可协议 MIT
发布最后发布2017年1月
SwiftSwift 版本3.0
SPM支持 SPM

Rajat Talwar 维护。



  • Pool My Ride

数据存储库套件

这是一个简单的依赖项,用于将通过网络调用获取的所有数据(无论是服务器上的还是本地存储上的)转换为类对象。

要求

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: 转换为和 扩展的统一API。[AnyAnyAny] 扩展用于网络传输或磁盘存储(CoreData)。

public protocol ObjectCoder:class{

    init(dictionary withDictionary:[String:Any])
    func toDictionary() -> [String:Any]
    static func identifierKey() -> String

}

数据存储库套件帮助处理两种类型的网络调用

REST API调用

要进行服务器调用,首先需要实现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 类定义(请参阅上文)。

您的 xcdatamodel 应该看起来像这样

logo

现在,既然我们已经为网络调用创建了模型,我们也可以为本地存储的调用创建一个模型。

        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 文件。