簡體   English   中英

IOS / Objective-C / CoreData:從NSSet刪除對象

[英]IOS/Objective-C/CoreData: Delete object from NSSet

我有一本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設置為新的書籍數量,但是據我所知,並沒有刪除開始時存在的底層額外托管對象。

我認為您的整個方法和架構可能過於復雜。

首先,請從Apple下載此示例項目 如果Apple斷開鏈接,請搜索它。 它稱為CoreDataBooks 花一兩天來研究它。 您會看到它是用Objective-C編寫的,就像您的代碼一樣。 而且,像您的項目一樣,它也有書籍和作者。 CoreDataBooks非常適合您!

我建議這樣做,因為看來您的代碼在視圖和模型(核心數據)之間插入了這些NSMutableSets和NSMutableArrays。 您不需要這樣做。 事實上,我只是在Apple項目中搜索了符號NSSet,NSMutableSet,NSArray和NSMutableArray。 我只發現了一個排序描述符數組! 在Apple的示例項目中,沒有任何作者或書籍的集合或陣列。

關於將數據同步到服務器,這是通過創建連接到同一持久性存儲的輔助受管對象上下文來完成的。 在適當的設計中,它根本不會與您的用戶界面有關,因此暫時不要擔心。 像在CoreDataBooks中一樣 ,首先讓您的用戶界面與本地Core Data存儲區一起工作 ,然后您將學到很多東西,並且將在處理同步方面處於更好的位置:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM