测试已测试 | ✓ |
Lang语言 | Obj-CObjective C |
许可 | MIT |
发布了最新发布 | 2016年4月 |
由Martijn Walraven维护。
依赖 | |
PocketSocket | >= 0 |
InflectorKit | >= 0 |
SimpleKeychain | >= 0 |
Meteor iOS 通过 DDP 将原生 iOS 应用与 Meteor 平台(https://www.meteor.js.cn)集成。它提供对延迟补偿的全支持,并支持 Core Data 编程模型。它用 Objective-C 编写,但也可以从 Swift 使用。
如果你是 Meteor 网络开发者... 现在原生 iOS 应用可以轻松参与 Meteor 的全栈反应式。
如果你是 iOS 开发者... Meteor 是一个节省你大量时间的 app 后端。
Meteor iOS 不只是一个原始的 DDP 客户端。它不是简单地通知你单个数据更新就结束了,而是被设计用来将全栈反应性带给 iOS。目前,这最简单地通过集成 Core Data 来实现。仅通过编写几行代码,我们就能从数据库到 UI 获取反应性更新。
它包括对延迟补偿的完全支持,并支持编写自定义方法占位符。考虑了并发执行,并将所有处理保持在主线程之外,发布批量合并的变化通知,这些可以用于更新 UI。
它与原始 Meteor JavaScript 代码的语义保持尽可能接近。其行为由 200 多个单元测试覆盖,且还包含一些使用本地 Meteor 测试服务器运行的服务器集成测试。
目前,包含的 Todos 示例(用 Swift 编写,适用于 iPhone 和 iPad)可能是了解 Meteor iOS 功能的最佳方式。如果你想试用,你应能够打开 Meteor 工作区并在 Todos 规划中运行。它连接到在 http://meteor-ios-todos.meteor.com 运行的 Meteor 示例应用。如果你想要快速了解它的功能,可以考虑查看这个简短的屏幕录制。
我仍在探索使用模式,并正在积极改进 API。我在自己的项目中使用 Meteor iOS 和 Core Data,所以这将是我在这里主要描述的。你也可以在较低级别使用 API 并直接处理文档。有关更高级 API 和不用 Core Data 使用 Meteor iOS 的更多信息,请参阅 这个维基页面。
目前请勿期待任何稳定的功能,但请告诉我您对API的看法以及您希望看到哪些改进。
基本使用实际上非常简单
METCoreDataDDPClient
,并调用它的connect
方法。将其设置为单例通常很方便,您可以随时访问它。addSubscriptionWithName:parameters:
来在服务器上调用发布函数并接收一组特定的文档。(如果您使用autopublish
,Meteor服务器会自动发布所有集合,无需订阅。它有严重的缺点,但在开发初期可能很有用。)collectionName
或fieldName
指定为userInfo
。所有类型的关系——一对一、一对多和多对多——都受支持。默认情况下,引用存储在两边的文档中(双向引用)。但您可以在模型编辑器中指定关系端为userInfo
的storage = false
。mainQueueManagedObjectContext
,并自动合并更改,这通常是您所需要的,但更复杂的设置(例如后台上下文、子上下文)也是可能的。NSFetchedResultsController
,所有影响指定检索请求的更改都将自动传播,无论它们是从Core Data、直接到文档中,还是从另一个客户端发送并由服务器发送。您可以使用此功能自动更新UITableView
或UICollectionView
等(这为您提供了一些巧妙的动画)。当然,您也可以自行观察NSManagedObjectContextDidSaveNotification
通知,并根据需要进行更改。defineStubForMethodWithName:usingBlock:
),这可以使本地更改并因此参与延迟补偿。loginWithEmail:password:completionHandler
),依赖于userID
的服务器发布将自动运行,并且服务器将发送更改到文档集(如果有)。(例如,待办事项示例使用自动发布属于当前登录用户的列表的privateLists
发布函数。)在Swift中设置METDDPClient
或METCoreDataDDPClient
最便利的方式是作为全局变量(Swift在底层使用dispatch_once
进行懒加载和线程安全的初始化)。
let Meteor = METCoreDataDDPClient(serverURL: NSURL(string: "wss://meteor-ios-todos.meteor.com/websocket"))
@UIApplicationMain
class AppDelegate: UIApplicationDelegate {
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
Meteor.connect()
}
}
“待办事项”示例中包含一个可以被用于等待订阅准备就绪的SubscriptionLoader
类(类似于Iron Router中的waitOn
选项)。在viewWillAppear
中使用它,可以轻松避免显示部分数据集(并且可能显示加载提示符,如在待办事项示例中)。由于订阅是共享和重复使用的, Therefore, calling viewWillAppear
again will not incur any additional cost, and if all subscriptions are loaded when called, whenReady
will be synchronous.
subscriptionLoader.addSubscriptionWithName("publicLists")
subscriptionLoader.addSubscriptionWithName("privateLists")
// Parameter 'list' is an NSManagedObject that will be automatically converted to a documentID
subscriptionLoader.addSubscriptionWithName("todos", parameters: list)
subscriptionLoader.whenReady {
self.fetchedResultsController.performFetch()
}
// The managedObjectContext is preferably set as a property on a UIViewController and passed on to the next one to support child contexts
let managedObjectContext = Meteor.mainQueueManagedObjectContext
let list = NSEntityDescription.insertNewObjectForEntityForName("List", inManagedObjectContext:managedObjectContext) as List
list.name = "Favorite Scientists"
let lovelace = NSEntityDescription.insertNewObjectForEntityForName("Todo", inManagedObjectContext:managedObjectContext) as Todo
lovelace.text = "Ada Lovelace"
lovelace.list = list
list.incompleteCount++
var error: NSError?
if !managedObjectContext.save(&error) {
println("Encountered error saving objects: \(error)")
}
NSIncrementalStore
子类集成了Core Data。文档与NSManagedObject
之间的映射是自动进行的(但可以进行自定义)。还支持不同类型的关联,无论是读取还是保存(可配置存储)。对文档的修改(可能来自其他客户端)将导致发布一个对象变更通知,用于将更改合并到NSManagedObjectContext
中。尽管该框架是用Objective-C编写的,但它与Swift配合得很好。事实上,我自己的待办事项示例以及我正在工作的一个更大的项目完全使用Swift。我计划在将来更新API以更好地利用Swift语言功能。我还计划包括(并记录!)从待办事项示例和我的项目代码中提取的某些Swift编写的实用代码。
在Swift发布的时候,我已经开始这项工作了。虽然我对Swift印象深刻,但我决定还不到重写的时机。这个语言当时还在发展中,一些可能有用的语言特性仍然缺失(特别是在泛型和协议方面)。性能可能不可预测(特别是处理数组和字典时),而且工具支持(Xcode)比Objective-C不稳定。一旦Swift语言和实现稳定下来,并且语言习惯确立,完整的或部分的重写可能变成一个可行的选择。
ACAccount
集成,这样用户就不需要提供登录凭证,而只需给予允许链接账户的权限。Meteor iOS在MIT许可证下可用。有关更多信息,请参阅LICENSE文件。
“待办事项”示例包含由Icons8提供的图标,这些图标是在Creative Commons Attribution-NoDerivs 3.0 Unported许可证下提供的。