2016-11-30 6 views
1

簡単に言うと、チャットベースのアプリケーション用にJSQMessagesViewControllerを使用しています。通常のメッセージの追加は正常に動作します。今問題に私はメッセージを受信し、それらをコアデータに格納するためにプッシュ通知を使用しています。私が立ち往生していることは、メッセージがチャットに即座に表示されないことです。あなたがリフレッシュしたように、その正確な時点では表示されますが、そうではありません。別のVCからJSQCollectionViewにメッセージを追加する:Swift

AppDelegate:

func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (_ options: UNNotificationPresentationOptions) -> Void) { 

    let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) 
    let messageVC = mainStoryboard.instantiateViewController(withIdentifier: "messageVC") as! messagesViewController 

    if let incomingMessageSenderId = notification.request.content.userInfo["User_ID"] as? NSString { 

     incomingMsgSenderId = String(incomingMessageSenderId) 
    } 
    if let message = notification.request.content.userInfo["Message"] as? String { 

     msg = String(message) 

    } 

    DispatchQueue.main.async { 

     messageVC.checkForMessages(id: incomingMsgSenderId) 
    } 

} 

MessagesVC

func checkForMessages(id: String) { 

    messages.removeAll() 

    let context : NSManagedObjectContext = appDel.managedObjectContext 

    let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Nd_conversation") 

    request.returnsObjectsAsFaults = false 

    request.predicate = NSPredicate(format: "to_user_id = %@", id) 

    do { 
     let results = try context.fetch(request) 

     if results.count > 0 { 

      for result in results as! [NSManagedObject] { 

       let conversation_id = result.value(forKey: "id") 

        let request2 = NSFetchRequest<NSFetchRequestResult> (entityName: "Nd_chat") 
        request2.returnsObjectsAsFaults = false 

        request2.predicate = NSPredicate(format: "conversation_id = %@", conversation_id! as! CVarArg) 

        do { 

         let results2 = try context.fetch(request2) 

         if results2.count > 0 { 
          for result2 in results2 as! [NSManagedObject] { 

           if let body = result2.value(forKey: "message_body") as? String { 


            loadedMessages.append(body) 

            if let sender_id = result2.value(forKey: "sender_id") as? Int { 

             let sent_id = String(sender_id) 

             print("Sender id: \(sent_id)") 

             senderIds.append(sender_id) 

             self.addMessage(sent_id, text: body) 
             self.finishSendingMessage(animated: true) 

            } 


           } 
           else if let imageData = result2.value(forKey: "media_path") as? NSData{ 
            //photo 

            let image = UIImage(data: imageData as Data) 

            let photoItem = JSQPhotoMediaItem(image: image) 

            if let sender_id = result2.value(forKey: "sender_id") as? Int { 

             let photoMessage = JSQMessage(senderId: String(sender_id), displayName: self.senderDisplayName, media: photoItem) 

             messages.append(photoMessage!) 

             self.finishSendingMessage(animated: true) 
            } 
           } 
          } 
         } 
        } 
      } 
     } 

コア・データが正常に動作します

は、ここでは、コードです。メッセージもメッセージ配列に追加されます。問題はself.finishSendingMessageにあります。私はしばらくの間これに固執しているので、誰もどんな提案も指摘できますか?ありがとう!

+0

あなたの問題は、アプリを使用しているユーザーが送信した送信メッセージ用の「finishSendingMessage」とは考えられません。あなたは受信メッセージを取得しようとしているときにコントローラをリフレッシュしようとしています。 –

+0

だから、finishReceivingMessagesを使うべきですか?それを試してみることができます! –

+0

いいえ私はあなたが言ったと言っています>問題はself.finishSendingMessage –

答えて

0

通知を使用して、VCの変更を監視および更新することができます。あなたが使用して通知を投稿することができ

extension Notification.Name { 
    static let reload = Notification.Name("reload") 
} 

NotificationCenter.default.post(name: .reload, object: nil) 

をし、データを再ロードするビューコントローラでオブザーバを追加します。

override func viewDidLoad() { 
    super.viewDidLoad() 
    NotificationCenter.default.addObserver(self, selector:#selector(reloadTableData(_:)), name: .reload, object: nil) 
} 

func reloadTableData(_ notification: Notification) { 
    tableView.reloadData() 
} 
通知名を

を作成します。

関連する問題