2017-02-24 22 views
0

我正在研究斯坦福CS193p的SmashTag流行提及任務(asst。#5),並且我已經有了一切正常工作。我正在研究額外任務#3:CS193P Smashtag Popularity Extra Task#3 - 只使用「IN」關鍵字獲取新推文

通過查詢數據庫中現有的實例加載大量數據,然後一次又一次地重複插入(如我們在演講中所做的一樣) ),表現可能相當差。通過在一個查詢中檢查數據庫中存在的一堆東西(然後僅創建不存在的東西),增強您的應用程序以使其更高效。謂詞操作符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是不是在陣列中的數據庫推文Twitter.Tweet s將與IN謂詞運算符一起工作。是否有人這樣做並可以提供一些見解?

注:我見過的許多解決方案都有一個用於搜索術語(通常稱爲查詢)的核心數據實體。我沒有這個,只有Tweet和Mention的實體,並且我有一切正常工作。

回答

0

你需要這樣的事(我假設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

+0

但如果想法是隻從數據庫中找到新的推文,不要那些推文需要在數據庫中?所以你必須在所有下載的tweets上運行你的tweet-entity-creator函數(tweetForTweetWithTwitterInfo在講座中),然後在新的數據庫中搜索與下載的tweet相匹配的tweets。如果重點僅僅是爲新推文運行創建者函數,這是太多工作。我在這裏錯過了什麼嗎? –