【问题标题】:RestKit retain CoreData objectsRestKit 保留 CoreData 对象
【发布时间】: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


【解决方案1】:

我终于看到了问题,它与删除孤立对象有关。因为在三个选项卡中是不同的实体,当我在实体中执行搜索时,会使其他实体成为孤立实体并删除数据!仅覆盖此属性:

override var deletesOrphanedObjects: Bool  {
        get{
            return false;
        }
        set{

        }
    };

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    • 2012-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多