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にあります。私はしばらくの間これに固執しているので、誰もどんな提案も指摘できますか?ありがとう!
あなたの問題は、アプリを使用しているユーザーが送信した送信メッセージ用の「finishSendingMessage」とは考えられません。あなたは受信メッセージを取得しようとしているときにコントローラをリフレッシュしようとしています。 –
だから、finishReceivingMessagesを使うべきですか?それを試してみることができます! –
いいえ私はあなたが言ったと言っています>問題はself.finishSendingMessage –