测试已测试 | ✗ |
语言语言 | 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 |
Warp iOS SDK 通过依赖管理器 CocoaPods 可用。
===================
Warp iOS SDK 是一个库,它基于 Alamofire、EVReflection、SwiftyJSON 和 PromiseKit 构建,用于使用 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 框架中,对象是数据在客户端和服务器之间传输的基本载体。
每个对象都包含不同的键,可以根据需要设置或检索这些键。其中三个特别的是}
这些键由服务器专门设置,用户无法修改。
要为特定模型保存对象,请使用 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
}
}