我正在 XMPP 的帮助下实现聊天功能,并且聊天工作正常。现在我正在处理图像上传,为此我将图像上传到 s3 存储桶,在将图像上传到 s3 之后,我使用 xmpp 方法将 s3 图像 url 作为消息发送给其他用户。这也工作正常但问题是它只有在我停留在同一屏幕上时才有效,即上传图像时的聊天屏幕。因此,如果我的图像仍在上传并且我从视图控制器中弹出,它会被释放,并且在将图像上传到 s3 后我的完成处理程序不会被调用,因此我的 sendMessage 方法也不会被调用。那么我怎样才能做到这一点。即使在上传图像时我在不同的屏幕上,我如何发送消息并调用完成处理程序。
这是我选择图片和上传图片的代码
@IBAction func didPressMedia(_ sender: Any) {
ImagePickerManager().pickImage(self) { \[weak self\] pickedImage in
guard let self = self else { return }
let compressedImage = pickedImage.resizedImage(newSize: CGSize(width: 120, height: 120))
let messageId = XMPPHelper.shared.xmppStream.generateUUID
let chat = ChatListModel()
chat.roomId = ""
chat.message = ""
chat.messageId = messageId
chat.time = String(Date().currentTimeMillis())
chat.to = self.viewModel.otherUser
chat.from = self.viewModel.myJid ?? ""
chat.type = "chat/image"
chat.imageLocalPath = messageId
chat.msgDeliveryStatus = MsgDeliveryStatus.sending.rawValue
chat.isSeenSync = true
chat.isUploading = "pending"
self.viewModel.setChatDataInRealm(item: chat, isAfterPickingImage: true)
//This is completion handler which get called after image upload to s3.
self.viewModel.didImageUploaded = { [weak self] isImgUploaded , imgUrl, imgMessageId in
guard let self = self else { return }
if isImgUploaded {
print("success uploading image")
self.viewModel.sendMessage(message: imgUrl, isImage: true, messageId: imgMessageId). // send image url as message to other user
}else{
print("error uploading image")
self.viewModel.updateRealmAfterImageUpload(uploadStatus: "failed", uploadedUrl: "", messsageId: imgMessageId)
}
}
self.viewModel.uploadImage(localPath: "\(Helper.shared.getDocumentDirectoryPath(filename: messageId)).png" ,image: compressedImage, messageId: messageId)
}
}