WarpSDK 1.2.0

WarpSDK 1.2.0

测试已测试
语言语言 SwiftSwift
许可证 MIT
发布上次发布2017年11月
SwiftSwift 版本3.0
SPM支持 SPM

Zonily Jame Pesquera 维护。



 
依赖项
Alamofire= 4.4.0
EVReflection= 4.2.0
SwiftyJSON= 3.1.4
PromiseKit= 4.4.0
PromiseKit/Alamofire= 4.4.0
 

WarpSDK 1.2.0

WarpSDK-iOS

Twitter
Github
Cocoapods
DividedByZero

Warp iOS SDK 通过依赖管理器 CocoaPods 可用。

===================

Warp iOS SDK 是一个库,它基于 AlamofireEVReflectionSwiftyJSONPromiseKit 构建,用于使用 Swift 实现 Warp 框架。它设计用于与基于 Warp 服务器 的项目一起工作。

目录

安装

要通过 Cocoapods 安装 Warp iOS SDK,只需在 podfile 中添加此内容,然后运行 pod install}

pod 'WarpSDK'

对于使用 Swift 2.3 的项目,请使用 Swift 2.3 分支。

配置

为了初始化 SDK 以进行 客户端开发,只需将以下配置添加到项目的主文件中}

// Import Warp
import WarpSDK

// Initialize Warp Inside AppDelegate 
func applicationDidFinishLaunching(application: UIApplication) {
    Warp.Initialize("http://my-warp-server.com/api/1/", apiKey: "12345678abcdefg")
}

对象

对象代表模型的单个实例。在数据库术语中,对象可以被视为表中的 。在整个 Warp 框架中,对象是数据在客户端和服务器之间传输的基本载体。

每个对象都包含不同的键,可以根据需要设置或检索这些键。其中三个特别的是}

  • id:区分表中对象的唯一标识符
  • createdAt:记录特定对象创建的日期和时间的戳(UTC)
  • updatedAt:记录特定对象最后修改的日期和时间的戳(UTC)

这些键由服务器专门设置,用户无法修改。

保存对象

要为特定模型保存对象,请使用 Warp.Object

let alien = Warp.Object(className: "alien")

您可以使用 .set(object: value: AnyObject, forKey: String) 方法设置对象的键值

alien.set(object: "TheDoctor", forKey: "name")
alien.set(object: "150000", forKey: "age")
alien.set(object: 4, forKey: "type")

然后,使用 .save() 方法保存对象

_ = alien.save()

// or 

_ = alien.save { (isSucess, error) in
    if error != nil {
        print(error)
    } else {
        print("The alien has been created with the following ID:", alien.id)
        print("The alien has been named:", alien.get(object: "name"))
    }
}

// or 

_ = alien.save().then { _ in
    print("The alien has been created with the following ID:", alien.id)
    print("The alien has been named:", alien.get(object: "name"))
}.catch(execute: { (error) in
    print(error)
})

检索对象

要检索特定模型的对象,您可以使用 Warp 查询。有关更多信息,请参阅查询部分

let alienQuery = Warp.Query(className: "alien")
// or
let alienQuery = Warp.ObjectQuery(className: "alien")

alienQuery.equalTo(16, forKey: "id")
_ = alienQuery.first { (warpObject, error) in
    // You now have a copy of alien (id: 16) from the database
}

// or

_ = alienQuery.first().then { warpObject in
    // You now have a copy of alien (id: 16) from the database
}

现在您已经获取了该对象,您也可以使用 .get(object: key: String) 方法获取其键

let name = alien.get(object: "name")
let age = alien.get(object: "age")
let type = alien.get(object: "type")

对于在第对象部分提到的特殊键,您可以通过以下属性检索它们的值

var id = alien.id
var createdAt = alien.createdAt
var updatedAt = alien.updatedAt

请注意,无法通过.get(object: key: String)方法检索这些字段。

更新对象

每次您使用.save()Warp Queries来保存/检索对象时,您可以直接使用相同的.set(object: value: AnyObject, forKey: String)方法修改这些对象的键。Warp会自动知道您已更新了这些字段,并准备对象进行更新。

例如,在调用.save()方法后

let alien = Warp.Object(className: "alien")
alien.set(object: "Madam Vestra", forKey: "name")
alien.set(object: 4, forKey: "type")

_ = alien.save { (isSucess, error) in
    // If this is the 200th alien, change its type, for example
    if alien.id > 200 {
        alien.set(object: 5, forKey: "type")
    }

    // Update the alien
    alien.save { (isSucess, error) in
        // The alien has been successfully updated
    }
}


// or

_ = alien.save().then { _ in
    // If this is the 200th alien, change its type, for example
    if alien.id > 200 {
        alien.set(object: 5, forKey: "type")
    }

    // Update the alien
    return alien.save().promise()
}.then { _ in
    // The alien has been successfully updated
}

例如,在从Warp Queries检索后

let alienQuery = Warp.Query(className: "alien")
// or
let alienQuery = Warp.ObjectQuery(className: "alien")
alienQuery.equalTo(5, forKey: "id")

_ = alienQuery.first { (alien, error) in
    alien?.set(object: 5, forKey: "age")

    alien?.save { (isSucess, error) in
        // The alien has been successfully updated
    }
}

// or

_ = alienQuery.first().then { alien in
    alien?.set(object: 30, forKey: "age")

    return alien?.save()
}.then { _ in
    // The alien has been successfully updated
}

此外,如果您尝试更新的键是整数并且您想原子性地增加或减少其值,您可以选择使用.increment()方法。

即将推出

删除对象

如果您想删除已保存的或检索到的对象,您只需要调用对象的.destroy()方法

_ = alien.destroy()

此外,与.save()类似,.destroy()方法也返回一个承诺,您可以将其链接到其他进程。

_ = alien.destroy { (isSucess, error) in
    print("The alien has been destroyed")            
}

// or

_ = alien.destroy().promise().then { _ in
    print("The alien has been destroyed")
}

指针

如果您的对象使用指针作为一些键的一部分,您可以直接使用.set()方法设置它们。

例如,如果您正在为alien对象创建一个planet,您可以使用以下方法

let planet = Warp.Object(className: "planet")
planet.set(object: "Raxocoricofallipatorius", forKey: "name") 

_ = planet.save { (isSucess, error) in
    let alien = Warp.Object(className: "alien")
    alien.set(object: "Slitheen", forKey: "name")
    alien.set(object: planet, forKey: "planet")

    alien.save { (isSucess, error) in
        // The alien has been successfully saved
    }
}

// or

_ = planet.save().then { _ in 
    let alien = Warp.Object(className: "alien")
    alien.set(object: "Slitheen", forKey: "name")
    alien.set(object: planet, forKey: "planet")

    return alien.save().promise()
}.then { _ in {
    // The alien has been successfully saved
}

例如,如果您有一个现成的planet并且想要将其用于alien对象,您可以使用以下方法

// For Objects, Warp.Object.createWithoutData(id: Int, className: String)
// For users, Warp.User.createWithoutData(id: Int)
let planet = Warp.Object.createWithoutData(id: 2, className: "planet")
let alien = Warp.Object(className: "alien")
alien.set(object: "Captain Jack Harkness", forKey: "name")
alien.set(object: planet, forKey: "planet")

_ = alien.save { (isSucess, error) in
    // The alien has been successfully saved
}

// or

_ = alien.save().then { _ in
    // The alien has been successfully saved
}

查询

在特定情况下,您可能会需要从模型中找到对象。在这些情况下,使用查询将非常方便。查询允许您根据一组标准找到特定的对象。

例如,如果您想查询来自alien模型的对象,您将使用以下代码

// Prepare query
let alienQuery = Warp.Query(className: "alien")
// or
let alienQuery = Warp.ObjectQuery(className: "alien")

// Use `.find()` to get all the objects in the `alien` table
_ = alienQuery.find { (aliens, error) in
    // You now have a collection of all the aliens        
}

// or

_ = alienQuery.find().then { aliens in
    // You now have a collection of all the aliens
}


// Use `.first()` to get the first object in the `alien` table
_ = alienQuery.first { (alien, error) in
    // You now have the first alien object            
}

// or 

_ = alienQuery.first().then { alien in 
    // You now have the first alien object
}

// Use `.get(_ objectId: Int)` to get a specific object in the `alien` table
let alienQuery = Warp.Query(className: "alien")
_ = alienQuery.get(3) { (object, error) in
    // You now have the object with the id 3
}

// or

_ = alienQuery.get(3).then { (object) in
    // You now have the object with the id 3
}

约束

约束有助于过滤特定查询的结果。为了为查询传递约束,请使用您希望应用以下任何约束

// Prepare query
let alienQuery = Warp.Query(className: "alien")
// or
let alienQuery = Warp.ObjectQuery(className: "alien")

// Find an exact match for the specified key
alienQuery.equalTo("The Doctor", forKey: "name")
alienQuery.notEqualTo("The Master", forKey: "name")

// If the key is ordinal (i.e. a string, a number or a date), you can use the following constraints
alienQuery.lessThan(21, forKey: "age")
alienQuery.lessThanOrEqualTo("Weeping Angels", forKey: "name")
alienQuery.greaterThanOrEqualTo(500, forKey: "life_points")
alienQuery.greaterThan("2016-08-15 17:30:00+00:00", forKey: "created_at")

// If you need to check if a field is null or not null
alienQuery.existsKey("type")
alienQuery.notExistsKey("type")

// If you need to find if a given key belongs in a list, you can use the following constraints
alienQuery.containedIn("Doctor", "Warrior", forKey: "role")
alienQuery.notContainedIn([18, 20], forKey: "age")

// If you need to search a string for a substring
alienQuery.startsWith("The", forKey: "name")
alienQuery.endsWith("Master", forKey: "name")
alienQuery.contains("M", forKey: "name")

// If you need to search multiple keys for a substring
alienQuery.contains("M", keys: "name", "username", "email")

限制

默认情况下,Warp将限制结果为满足查询标准的顶级100个对象。为了提高限制,您可以通过.limit()方法指定所需值。另外,为了实现结果分页,您可以将.limit().skip()方法结合使用。.skip()方法表示在执行查询时跳过的项目数。在可扩展性方面,建议将结果限制为1000,并使用跳转来确定分页。

例如

alienQuery.limit(1000) // Top 1000 results
alienQuery.skip(1000) // Skip the first 1000 results

请注意;建议您使用排序方法来检索更可预测的结果。更多信息,请参阅下面的部分。

排序

排序确定返回结果的顺序。它们在使用limit和skip参数时也非常关键。要排序查询,请使用以下方法

alienQuery.sortBy('age'); // Sorts the query by age, in ascending order
alienQuery.sortByDescending(['created_at', 'life_points']); // You can also use an array to sort by multiple keys

包含指针键

为了包含属于指针的键,我们可以使用.include(values: [String])方法。

alienQuery.include("planet.name", "planet.color")

上述查询将返回具有相应行星指针的异形

alienQuery.find { (aliens, error) in
    if error == nil {
        for alien in aliens! {
            let greeting = "I am " + (alien.get(object: "name") as! String) + " and I come from the Planet " + (alien.get(object: "planet")?.get(object: "name") as! String)
            print(greeting)
        }
    }
}

用户

用户帐户通常是应用程序的一个关键部分。在Warp中,这些由Warp用户表示。Warp用户扩展自Warp对象,这意味着您可以使用在Warp对象中找到的相同方法;然而,Warp用户具有专门针对用户帐户管理量身打造的额外方法。

获取特殊用户键

除了id、createdAt和updatedAt之外,Warp用户还具有以下get方法

let userQuery = Warp.UserQuery()
// or
let userQuery = Warp.User.Query()
userQuery.equalTo(5, forKey: "id").first { (user, error) in
    if let unwrappedError = error {
        print(unwrappedError)
    } else {
        var id = user?.id
        var createdAt = user?.createdAt
        var updatedAt = user?.updatedAt
        var username = user?.username
        var email = user?.email
    }
}

请注意,对于用户查询,我们应该使用WarpUser.query()而不是使用WarpQuery(className: "user")

登录

要登录用户帐户,您将使用.login(username: String, password: String, completion: { (isSucess, error) in })方法

Warp.User().login("username", password: "password") { (isSucess, error) in
    if error != nil {
        // Successfully logged in
    } else {
        // There was an error
    }
}

获取当前用户

要获取当前登录用户,您将使用.current()方法

var current = WarpUser.current()

注册

要注册新用户帐户,您将使用.signUp({ (isSucess, error) in })方法

let user = Warp.User()
user.setUsername("Luke Smith")
user.setPassword("k9_and_sara")

user.signUp { (isSucess, error) in
    if error != nil {
        // Signed up; `.current()` returns the registered user
        let current = WarpUser.current()
    } else {
        // There was an error
    }
}

请注意,您不能使用.save()来创建用户。您只能使用.save()来更新已经注册或登录的用户。

退出登录

要退出用户账户,您将使用.logOut()方法

user.logout { (isSucess, error) in
    if error != nil {
        // Logged out; `.current()` now returns nil
        var current = WarpUser.current()
    } else {
        // There was an error
    }
}

函数

要从API运行Warp函数,您可以使用Warp函数

// WarpFunction.run(functionName: String, parameters: [String: Any]?, completion: { (result, error) in })

WarpFunction.run("get-votes", parameters: ["from":"2016-08-14", "to":"2016-08-15"]) { (result, error) in
    if error == nil {
        // `result` contains a JSON Object of the results from the API
    } else {
        // There was an error
    }
}