【问题标题】:CS193P Smashtag Popularity Extra Task #3 - Get only new tweets using "IN" keywordCS193P Smashtag Popularity Extra Task #3 - 仅使用“IN”关键字获取新推文
【发布时间】:2017-02-24 02:25:12
【问题描述】:

我正在处理斯坦福 CS193p 的 SmashTag 人气提及作业(助理 #5),并且一切正常。我正在处理额外任务 #3:

通过查询数据库中的现有实例来加载大量数据,然后一遍又一遍地插入(如果没有找到)(就像我们在讲座中所做的那样),性能可能会很差。通过在一个查询中检查您希望在数据库中存在的一堆东西(然后只创建不存在的东西)来增强您的应用程序以提高效率。谓词运算符 IN 在这里可能很有价值。

我已经设法做到了类似这样的事情,但没有使用IN 谓词运算符!这是在我的updateDatabase(with newTweets:) 方法的perform 块内:(我已经调用了我的核心数据实体CDTweet

if let databaseTweets = try? globalContext!.fetch(NSFetchRequest<CDTweet>(entityName: "CDTweet")) {
            let databaseIDs = databaseTweets.map { $0.id! }
            for twitterInfo in newTweets where !databaseIDs.contains(twitterInfo.id) {
                _ = CDTweet.createCDTweet(with: twitterInfo, into: globalContext!)
            }
        }

如您所见,我获取了数据库中的所有推文,获取了它们的 ID,然后仅为 ID 不在数据库推文数组中的 internet-fetched-Twitter.Tweets 创建一条新推文。

这似乎运行正常(即,仅创建新推文),但我很好奇讲师如何想象它会与 IN 谓词运算符一起使用。有没有人这样做并且可以提供一些见解?

注意:我见过的许多解决方案都有一个用于搜索词的核心数据实体(通常称为查询)。我没有这个,只有 Tweet 和 Mention 的实体,而且一切正常。

【问题讨论】:

    标签: swift cs193p


    【解决方案1】:

    你需要这样的东西(我假设searchIDs 是你正在寻找的值数组):

    var searchIDs = // ... an array of IDs you are searching for
    var fetchRequest = NSFetchRequest<CDTweet>(entityName: "CDTweet")
    let predicate = NSPredicate(format: "id IN %@", searchIDs)
    fetchRequest.predicate = predicate
    databaseTweets = try? globalContext!.fetch(fetchRequest) {
         // here you should only get all entries with IDs in the newTweets array
    } 
    

    关于谓词的详细信息可以找到here,关于谓词语法尤其是here

    【讨论】:

    • 但是如果我们的想法是只从数据库中查找新的推文,这些推文是否需要已经在数据库中?所以你必须在所有下载的推文上运行你的 tweet-entity-creator 函数(讲座中的 tweetForTweetWithTwitterInfo),然后在新数据库中搜索与下载的推文匹配的推文。如果重点是只为新推文运行创建者功能,那么工作量就太大了。我在这里错过了什么吗?
    猜你喜欢
    • 1970-01-01
    • 2017-07-14
    • 2015-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多