キャッシュにコア データを使用して、RSS リーダーに取り組んできました。多くの人と同じように、重複したエントリを避けたかったため、この質問とこの質問に至りました。しかし、もう 1 つ、ユーザーが記事を削除できる機能を提供し、フィードを更新するときに、削除された記事がまだフィードに存在する場合に、削除された記事を再度追加しないようにしたいと考えていました。したがって、現在の私の解決策は、削除された記事の一意の識別子 (フィード内の各アイテムを識別する方法) を持つ別のエンティティを管理オブジェクト コンテキストに維持することです。削除されている記事の識別子をそのエンティティに追加するだけです。 、それに対してチェックします。
ここで、上記のすべてを達成するために私が書いたコードを示します。このコードは、解析プロセス中にフィード内の新しいアイテムが解析されるたびに実行されます。
dispatch_queue_t checkQueue = dispatch_queue_create("com.feedreader.backgroundchecking", NULL);
dispatch_async(checkQueue,^{
NSMutableArray *mutablesortedArticles = [NSMutableArray arrayWithArray:self.feeds.sortedArticles];
if (!mutablesortedArticles) {
// Handle the error.
}
if ([[mutablesortedArticles valueForKey:@"identifier"]
containsObject:article.identifier]) {
NSLog(@"This article already exists");
return;
}else {
NSMutableArray *mutabledeletedArticles = [NSArray arrayWithArray:self.alldeletedArticles];
if (!mutabledeletedArticles) {
// Handle the error.
}
if ([mutabledeletedArticles valueForKey:@"identifier"]
containsObject:article.identifier]) {
NSLog(@"This article has been deleted");
return;
}else {
Article *newArticle = [NSEntityDescription insertNewObjectForEntityForName:@"Article" inManagedObjectContext:self.managedObjectContext];
newArticle.title = article.title;
newArticle.date = article.date;
newArticle.link = article.link;
newArticle.summary = article.summary;
newArticle.image = article.image;
newArticle.identifier = article.identifier;
newArticle.updated = article.updated;
newArticle.content = article.content;
newArticle.feed = self.feed;
dispatch_async(dispatch_get_main_queue(),^{
NSError *error = nil;
[self.managedObjectContext save:&error];
if (error) {
NSLog(@"%@", error);
}
});
}
}
});
self.feeds.sortedArticles と self.alldeletedArticles の両方が、解析が開始される前に管理オブジェクト コンテキストから取得されます。
私の問題は、このコードが実行されているときに始まり、UI が 1 ~ 2 秒間フリーズします (管理オブジェクト コンテキストに 500 を少し超える記事があるフィードで試しました)。だから、私の質問は、私がここでやろうとしていることを行うためのより効率的な方法、うまくいけばUIをフリーズさせない方法があるということだと思いますか? おそらく、削除された記事を処理するためのより良い方法でしょうか?