2016-10-24 19 views
0

私はこの質問のために自分のコードをわずか12行に減らしました。私はfetchedResultsControllerをj​​sqMessagesViewControllerフレームワークにリンクしました。コレクションに1つのアイテムを挿入すると、collectionView内に1つのアイテムがすべてリロードされます

送信ボタンを押すとオブジェクトがコンテキストに挿入され、fetchedResultsControllerの.Insertがアクティブになります。

何らかの理由で、コレクションビューに挿入するたびに、コレクションビュー内のすべてのものがリロードされます。これはたくさんのバグを引き起こしています.JSQフレームワーク自体が間違っているのか、それとも正常であるのかは分かりません。

とにかく、ここに私のコード全体があります。長いことではなく、使い慣れたコードデータを素早く手に入れることができれば、これは読みやすい風でなければなりません。

class ChatController: JSQMessagesViewController, NSFetchedResultsControllerDelegate { 

    let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext 

    lazy var fetchedResultsControler: NSFetchedResultsController<NSFetchRequestResult> = { 

     let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Message") 
     fetchRequest.sortDescriptors = [NSSortDescriptor(key: "timestamp", ascending: true)] 
     let frc = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: self.context, sectionNameKeyPath: nil, cacheName: nil) 
     frc.delegate = self 
     return frc 
    }() 

func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) { 
    if type == .insert { 
      collectionView.insertItems(at: [newIndexPath!]) 
      scrollToBottom(animated: true) 
    } 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 
    self.senderId = "" 
    self.senderDisplayName = "" 

    do { 
     try fetchedResultsControler.performFetch() 
    } 

    catch { }  
} 

override func didPressSend(_ button: UIButton!, withMessageText text: String!, senderId: String!, senderDisplayName: String!, date: Date!) { 
    let message = NSEntityDescription.insertNewObject(forEntityName: "Message", into: context) as! Message 

    message.text = text 
    message.timestamp = Date() as NSDate?  
} 

override func collectionView(_ collectionView: JSQMessagesCollectionView!, messageDataForItemAt indexPath: IndexPath!) -> JSQMessageData! { 
    let msg : Message = fetchedResultsControler.object(at: indexPath) as! Message 
    let messageData = JSQMessage(senderId: senderId, displayName: senderDisplayName, text: msg.text) 
    return messageData 
} 


override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
    return (fetchedResultsControler.sections?[0].numberOfObjects)! 
} 

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
    let cell = super.collectionView(collectionView, cellForItemAt: indexPath) as! JSQMessagesCollectionViewCell 
    cell.layer.shouldRasterize = true 
    cell.layer.rasterizationScale = UIScreen.main.scale 
    return cell 
} 

override func collectionView(_ collectionView: JSQMessagesCollectionView!, messageBubbleImageDataForItemAt indexPath: IndexPath!) -> JSQMessageBubbleImageDataSource! { 
    let bubbleFactory = JSQMessagesBubbleImageFactory() 
    return bubbleFactory?.outgoingMessagesBubbleImage(with: .black) 
} 

override func collectionView(_ collectionView: JSQMessagesCollectionView!, avatarImageDataForItemAt indexPath: IndexPath!) -> JSQMessageAvatarImageDataSource! { 
    return nil 
} 

} 

答えて

0

これがあなたを助けてくれるかどうかはわかりませんが、

collectionView?.performBatchUpdates({ 
      self.collectionView?.reloadItems(at: indexPaths) 
     }) { completed in 
      //Your Completion Code 
      } 
     } 
+0

こんにちはDeepak、私の問題は、一度に1つのことをリロードしたいのではありません。実際、私は何かをリロードしたくない。しかし何らかの理由で、コレクションにアイテムを挿入すると、コレクションビューの他のすべてのアイテムがリロードされます。私が知っていることは起こっているべきことではありません。 – slimboy

関連する問題