ユーザーがアプリを実行すると、まずログインする必要があります。ログインが成功すると、setUpSavingという関数がトリガされます。 setUpSavingでは、コードのコメント部分に書いたように(「Firebaseの事柄はすべて起こり、すべてのメッセージを1つずつ取得し、createMessageWithTextを通ってメッセージをコアデータに挿入して最終的に保存します"バックグラウンドスレッドでNSFetchedResultsControllerのフェッチを実行するのがいいですか?
ここで私の問題は、彼がメッセージングしている相手に20,000のメッセージが関連付けられているとしましょう。彼がChatLogControllerに行くと、すべてのメッセージがユーザーのために存在する必要があります。つまり、NSFetchedResultsControllerを使用してフェッチを実行して、ログインコントローラに保存されたすべてのメッセージをロードすることです。私の問題は、このすべてがメインキューにあり、時にはUIが凍結されていることです。 chatLogControllerは下にあります(すべてではなく、fetchedResultsControllerの部分とcollectionViewだけです)。私はbaでフェッチを実行する方法を知りましたckgroundキューを更新しますが、まだメインキューのcollectionViewを更新します。
func setUpSaving() {
///////some firebase stuff happens, grabs all the messages, and for each message, one by one, it goes through createMessageWithText and inserts the message into core data,
somewhere along the line context.save() gets triggered saving the message.
}
private func createMessageWithText(text: String, friend: Friend, context: NSManagedObjectContext, date: NSDate, isSender: Bool = false, sentStatus: String, fromID: String) -> Mesages {
let message = NSEntityDescription.insertNewObjectForEntityForName("Mesages", inManagedObjectContext: context) as! Mesages
message.user = friend
message.text = text
message.timestamp = date
message.isSender = isSender
message.fromID = fromID
message.status = sentStatus
return message
}
}
lazy var fetchedResultsControler: NSFetchedResultsController = {
let fetchRequest = NSFetchRequest(entityName: "Mesages")
fetchRequest.fetchBatchSize = 20
fetchRequest.includesPendingChanges = false
fetchRequest.sortDescriptors = [NSSortDescriptor(key: "timestamp", ascending: true)]
fetchRequest.predicate = NSPredicate(format: "user.id = %@", self.friend!.id!)
let moc = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext
let frc = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: moc, sectionNameKeyPath: nil, cacheName: nil)
frc.delegate = self
return frc
}()
override func viewDidLoad() {
super.viewDidLoad()
NavigationItems()
revealStatus()
do {
try fetchedResultsControler.performFetch()
} catch let err {
print(err)
}
override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) ->
Int {
if let count = fetchedResultsControler.sections?[0].numberOfObjects {
return count
}
return 0
}
override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = super.collectionView(collectionView, cellForItemAtIndexPath: indexPath) as! JSQMessagesCollectionViewCell
return cell
}
こんにちはワイン、返信いただきありがとうございます。 「検索はサーバーによって行われるべきです」ということは何を意味しますか。私は検索機能について言及しなかった。私が見逃しているものがあれば、私は入力を感謝します! – slimboy
私は、デバイス上に20k個のアイテムをローカルに置いた理由が検索であると推測しているかもしれません... – Wain
ああ、それでは、すべてがfirebaseから取得され、コアデータに保存されています。 。 – slimboy