在 Swift 中使用 RestKit 和 CoreData
Posted
技术标签:
【中文标题】在 Swift 中使用 RestKit 和 CoreData【英文标题】:Using RestKit and CoreData with Swift 【发布时间】:2015-01-19 15:34:50 【问题描述】:我尝试在 Swift 中使用带有桥接头的 RestKit。我有一个 URL 为“http://local:8888/api/0.1/jobs”的 JSON 文件
"data":["id": "1", "name": "job1",..,"id": "2", "name": "job2",...,...]
JSON 文件有 6 个元素 Job。我为 CoreData 创建了 Job 实体并生成了 Job 类。
我是这样设置 RestKit 的:
func setupRestKit()
var manager = RKObjectManager(baseURL: NSURL(string: "http://local:8888/api/0.1/"))
RKObjectManager.setSharedManager(manager)
var managedObjectModel = NSManagedObjectModel.mergedModelFromBundles(nil)
var managedObjectStore = RKManagedObjectStore(managedObjectModel: managedObjectModel)
manager.managedObjectStore = managedObjectStore
RKManagedObjectStore.setDefaultStore(manager.managedObjectStore)
var jobMapping = RKEntityMapping(forEntityForName: "Job", inManagedObjectStore: manager.managedObjectStore)
jobMapping.identificationAttributes = ["id"]
jobMapping.addAttributeMappingsFromDictionary([
"id" : "id",
"name" : "name"
])
let responseDescriptor = RKResponseDescriptor(
mapping: jobMapping,
method: RKRequestMethod.GET,
pathPattern: "/jobs",
keyPath: "data",
statusCodes: NSIndexSet(index: 200)
)
manager.addResponseDescriptor(responseDescriptor)
managedObjectStore.createPersistentStoreCoordinator()
let storePath = RKApplicationDataDirectory().stringByAppendingPathComponent("MyApp.sql")
var persistentStore = managedObjectStore.addSQLitePersistentStoreAtPath(
storePath,
fromSeedDatabaseAtPath: nil,
withConfiguration: nil,
options: optionsForSqliteStore(),
error: nil
)
managedObjectStore.createManagedObjectContexts()
managedObjectStore.managedObjectCache = RKInMemoryManagedObjectCache(
managedObjectContext: managedObjectStore.persistentStoreManagedObjectContext
)
func optionsForSqliteStore() -> NSDictionary
return [
NSInferMappingModelAutomaticallyOption: true,
NSMigratePersistentStoresAutomaticallyOption: true
];
在 ViewController 中:
override func viewDidLoad()
super.viewDidLoad()
var fetchRequest = NSFetchRequest(entityName: "Job")
fetchRequest.sortDescriptors = [NSSortDescriptor(key: "name", ascending: true)]
self.fetchedResultsController = NSFetchedResultsController(
fetchRequest: fetchRequest,
managedObjectContext: RKManagedObjectStore.defaultStore().mainQueueManagedObjectContext,
sectionNameKeyPath: nil,
cacheName: nil
)
self.fetchedResultsController?.delegate = self
self.fetchedResultsController?.performFetch(nil)
tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "Cell")
func numberOfSectionsInTableView(tableView: UITableView) -> Int
if let sections = fetchedResultsController?.sections
return sections.count
else
return 0
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
if let sections = fetchedResultsController?.sections
var sectionInfo: AnyObject = sections[section]
return sectionInfo.numberOfObjects
else
return 0
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
let cell = tableView.dequeueReusableCellWithIdentifier("Cell") as UITableViewCell
if let fetchedResults = fetchedResultsController
cell.textLabel?.text = fetchedResults.objectAtIndexPath(indexPath).name
return cell
numberOfSectionsInTableView 方法返回值 0,tableView numberOfRowsInSection 也返回值 0。
我通过从 Objective-C 翻译代码尝试了许多解决方案,因为没有太多使用 RestKit 的 Swift 示例。
我可以使用 SwiftyJson 框架访问来自 JSON 的数据,并且我还可以通过自己在 CoreData 数据库中存储元素来验证我的配置。
我想获得我用这个简单的 RestApi 创建的 6 个作业并将其打印在 tableView 中。
我认为我在配置过程中做错了什么,但我不知道是什么。
【问题讨论】:
我可能遗漏了一些东西,因为我没有将 RestKit 与 CoreData 一起使用,但是,我看到您使用NSFetchedResultsController
从 CoreData 中获取数据的位置,但我没有查看实际上会导致从服务器获取数据的任何内容。
谢谢大卫,我是个笑话,我只需要使用manager.getObjectsAtPath(...)
NP Meak,我们都有大脑放屁。我建议将其作为错字关闭。
【参考方案1】:
正如大卫所说,我忘记从服务器获取数据(谢谢)。
// I just need to map correctly the path
var manager = RKObjectManager(baseURL: NSURL(string: "http://local:8888/api/0.1/jobs"))
[...]
var persistentStore = managedObjectStore.addSQLitePersistentStoreAtPath(
storePath,
fromSeedDatabaseAtPath: nil, // Set-up this
withConfiguration: nil,
options: optionsForSqliteStore(),
error: nil
)
managedObjectStore.createManagedObjectContexts()
managedObjectStore.managedObjectCache = RKInMemoryManagedObjectCache(
managedObjectContext: managedObjectStore.persistentStoreManagedObjectContext
)
manager.getObjectsAtPath(
"", // Add path
parameters: nil,
success: nil,
failure: nil
)
我得到了我的视图中的项目。
【讨论】:
以上是关于在 Swift 中使用 RestKit 和 CoreData的主要内容,如果未能解决你的问题,请参考以下文章
在 Swift 中执行 Restkit addFetchRequestBlock 以进行孤儿删除
RestKit 编译失败,cocoapods use_frameworks for swift
使用 Restkit MainQueueManagedObjectContext 的奇怪崩溃 - EXC_BAD_ACCESS