0

ユーザーがアプリを実行すると、まずログインする必要があります。ログインが成功すると、setUpSavingという関数がトリガされます。 setUpSavingでは、コードのコメント部分に書いたように(「Firebaseの事柄はすべて起こり、すべてのメッセージを1つずつ取得し、createMessageWithTextを通ってメッセージをコアデータに挿入して最終的に保存します"バックグラウンドスレッドでNSFe​​tchedResultsControllerのフェッチを実行するのがいいですか?

ここで私の問題は、彼がメッセージングしている相手に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 
} 

答えて

0

いいえ、あなたがバックグラウンドスレッドでUIを駆動するFRCをフェッチするべきではありません。

あなたの問題は、ログイン後に20,000アイテムを読み込むことの背後にあるアイデアです。誰もその数のメッセージをモバイルデバイス上で見ることはできません。あなたはログイン後に20を得たいと思うかもしれませんし、総数ですが、それだけです。

ユーザーがメッセージを表示すると、オンデマンドでページをロードする必要があります(おそらく20から100個のメッセージ)。このようにして、ユーザーが使用するよう依頼していないリソースを使用したり、処理に時間を要したりすることはありません。

検索はサーバーでも行う必要があります。

+0

こんにちはワイン、返信いただきありがとうございます。 「検索はサーバーによって行われるべきです」ということは何を意味しますか。私は検索機能について言及しなかった。私が見逃しているものがあれば、私は入力を感謝します! – slimboy

+0

私は、デバイス上に20k個のアイテムをローカルに置いた理由が検索であると推測しているかもしれません... – Wain

+0

ああ、それでは、すべてがfirebaseから取得され、コアデータに保存されています。 。 – slimboy

関連する問題