【发布时间】:2016-07-08 08:33:36
【问题描述】:
我在应用程序中使用 RestKit,我配置了映射器并且工作正常。我决定使用 CoreData 进行缓存,并使用通常的 fecthController 在表格视图中显示核心数据模型。我的应用程序的第一个屏幕是一个带有三个选项卡的 UITabViewController。在每个选项卡中,我都有来自不同实体的不同信息,我可以在选项卡之间切换并且一切正常。问题是当我在选项卡中进行搜索时,我丢失了其他选项卡中的数据。我已经深入研究了这个问题,我看到了以下内容:当我搜索某些东西时,我正在删除我的其他实体!!。我尝试创建不同的上下文和一些与核心数据相关的内容,但没有任何效果。
// Configuration stuff
let objectManager: RKObjectManager = RKObjectManager(baseURL: baseURL);
let managedObjectModel: NSManagedObjectModel = NSManagedObjectModel(contentsOfURL: modelURL!)!;
let managedObjectStore: RKManagedObjectStore = RKManagedObjectStore(managedObjectModel: managedObjectModel);
objectManager.managedObjectStore = managedObjectStore;
managedObjectStore.createPersistentStoreCoordinator();
do {
try managedObjectStore.addSQLitePersistentStoreAtPath(storePath, fromSeedDatabaseAtPath: seedPath, withConfiguration: nil, options: nil);
} catch let err as NSError {
fatalError()
}
// Create the managed object contexts
managedObjectStore.createManagedObjectContexts();
managedObjectStore.managedObjectCache = RKInMemoryManagedObjectCache(managedObjectContext: managedObjectStore.persistentStoreManagedObjectContext)
// Mapping
let entityMapping: RKEntityMapping = RKEntityMapping(
forEntityForName: "Entity",
inManagedObjectStore: RKObjectManager.sharedManager().managedObjectStore
);
entityMapping.identificationAttributes = ["id"];
entityMapping.addAttributeMappingsFromArray([
"id", "firstName", "lastName", "birthdate"
]);
//Get Data from server
class Datalist{
class fun fetchData(successClosure:[Entity]->Void,failure:String->Void){
RKObjectManager.sharedManager().getObjectsAtPath(
path,
parameters: nil,
success: {
( operation: RKObjectRequestOperation!, result: RKMappingResult!) -> Void in
dispatch_async(dispatch_get_main_queue(), {
() -> Void in
successClosure(result.array());
});
},
failure: {
( operation: RKObjectRequestOperation!, error: NSError!) -> Void in
dispatch_async(dispatch_get_main_queue(), {
() -> Void in
failureClosure();
});
}
);
}
}
}
//Show data
class ListViewController:NSFetchedResultsControllerDelegate{
private var fetchedResultsController: NSFetchedResultsController!;
override func viewDidLoad() {
super.viewDidLoad();
fetchedResultsController = NSFetchedResultsController(
fetchRequest: fetchRequest, managedObjectContext: RKManagedObjectStore.defaultStore().mainQueueManagedObjectContext,
sectionNameKeyPath: "formatted",
cacheName: nil)
fetchedResultsController?.delegate = self
getData()
}
private func getData(){
DataList.fetchData({data in
let ids = getEntitiesId(data)
fetchedResultsController.fetchRequest.predicate = createPredicateFromIds(ids)
try! self.fetchedResultsController?.performFetch()
},failure:{message in
showMessage(message)
})
}
func createPredicateFromIds( entityIds: [Int] ) -> NSPredicate {
let predicate: NSPredicate = NSPredicate( format: "id IN $ENTITYIDS" ).predicateWithSubstitutionVariables(["ENTITYIDS" : entityIds]);
return predicate;
}
}
【问题讨论】:
-
你需要展示一些代码并详细说明你是如何测试的以及你实际看到的消失了
-
我提供了一个例子!谢谢@Wain
-
那么什么是数据列表以及您在谓词中使用的 id 是什么?谓词是否只排除所有内容?
-
Datalist 使用 RestKit 从服务器检索数据,最后刷新表格,从核心数据中获取对象。
-
所以要么谓词错误,要么只需要在设置新谓词时刷新 UI
标签: ios swift core-data restkit