我一直在研究 RSS 阅读器,使用核心数据进行缓存。像很多人一样,我想避免重复条目,这导致我提出了这个问题,也是这个问题。但是,我还想要一件事,我也想给用户删除文章的能力,并且在刷新提要时避免再次添加已删除的文章,即如果删除的文章仍然存在于提要中。因此,我目前的解决方案是,要在我的托管对象上下文中使用已删除文章的唯一标识符(我如何识别提要中的每个项目)维护另一个实体,我只需将要删除的文章的标识符添加到该实体, 并对其进行检查。
现在,这是我为完成上述所有操作而编写的一段代码。在解析过程中,每次解析提要中的新项目时都会运行此代码。
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?也许是处理已删除文章的更好方法?