IOS / Objective-C / CoreData:从NSSet中删除对象

时间:2017-07-04 15:15:24

标签: ios core-data nsset

我有一套与核心数据中的作者对象有多对一关系的书籍。

有一个视图,用户可以编辑这些视图,包括将它们留空。用户还可以添加新的。这导致了以下情况:

1)我们最终得到相同数量的书籍,只有编辑过 2)我们最终会有更少的书籍,这意味着应该从NSSet中删除一些书籍 3)我们最终得到了更多的书籍,这意味着有些书籍应该添加到NSSet中。

我最初的方法是将项目转换为NSMutableArray,在mutablearray中进行更改,转换回NSSet并将NSSet与对象关联。

然而,虽然这适用于核心数据的对象图,但它似乎并没有删除持久存储中的实际底层对象。

或者,由于NSSet缺少索引,我无法确定删除NSSet中特定对象的方法。

以下代码编辑书籍的名称,假设书籍数量没有变化。但是,如果编辑后的书籍数量较少,我可以告诉它不会从持久存储中删除丢失的书籍。它只是改变了核心数据对象图中的相关对象。当我将持久存储同步到服务器时,这会产生问题。

因此,基本上寻找在没有索引的情况下识别和删除NSSet中的项目的方法。感谢您的任何建议。

NSSet *booksForAuthor = _author.books;
    NSMutableArray *theBooks = [[booksForAuthor allObjects] mutableCopy];

    NSSortDescriptor *sortDescriptor= [[NSSortDescriptor alloc] initWithKey:@"bid"
                                                 ascending:YES];
    NSArray *booksArray = [theBooks sortedArrayUsingDescriptors:@[sortDescriptor]];
    _numStartingBooks = [booksArray count];
    _booksOnLoad = booksArray; //Now have an array of books before edit
 NSMutableArray <NSString*> *bookNames=[NSMutableArray arrayWithCapacity:20];
   //now collect new set of books from user into array (code omitted)
    [bookNames removeObject:@""];//remove any blanks
    _numBooks = [bookNames count];//number of books after edit
    int i;
        for (i = 0; i < _numStartingBooks; i++) {
            [theNewBooks addObject:_booksOnLoad[i]];
            theNewBooks[i].name = bookNames[i];
        }    
     NSSet *theBookSet = [NSSet setWithArray:theNewBooks];
     _author.books = theBookSet;

此时,我们已将NSSet设置为新的书籍数量,但据我所知,未删除开头存在的底层额外管理对象。

1 个答案:

答案 0 :(得分:0)

我想也许你的整个方法和架构过于复杂。

首先,请下载this sample project from Apple。如果Apple断开链接,请搜索它。它被称为 CoreDataBooks 。花一两天时间研究它。你会发现它是用Objective-C编写的,就像你的代码一样。而且,就像你的项目一样,它有书籍和作者。 CoreDataBooks非常适合您!

我建议这样做,因为您的代码似乎在视图和模型(Core Data)之间插入了这些NSMutableSets和NSMutableArrays。你不应该这样做。事实上,我只是在Apple项目中搜索符号NSSet,NSMutableSet,NSArray和NSMutableArray。我只发现了一个排序描述符数组! Apple的示例项目中没有任何作者或书籍的集合或数组。

关于将数据同步到服务器,这是通过创建连接到同一持久性存储的辅助托管对象上下文来完成的。在适当的设计中,它根本不会涉及您的用户界面,所以现在不要担心它。让您的用户界面首先使用本地Core Data存储,就像在 CoreDataBooks 中一样,到那时您将学到很多东西并且处于更好的位置来处理同步:)