Parse Messenger聊天Swift:信息有问题
最近我一直在我的ios Messenger的一些麻烦。起初我只提取短信,一切都很完美。当我试图从解析中获取图像时,我成功了;但是,Feed没有按照正确的顺序排列。 好像它无视“query.orderByAscending”完全...Parse Messenger聊天Swift:信息有问题
fetchMessages()
{
currentUser = PFUser.currentUser()!
let query = PFQuery(className:"Messages")
query.whereKey("convoid", equalTo:convoid)
query.orderByAscending("createdAt")
query.cachePolicy = .NetworkElseCache
query.findObjectsInBackgroundWithBlock {
(objects: [PFObject]?, error: NSError?) -> Void in
if error == nil {
dispatch_async(dispatch_get_main_queue()) {
if let objects = objects {
for object in objects {
if(object["fileType"] as? String == "photo"){
if(object["senderId"] as? String == self.currentUser.objectId!){
let userImageFile = object["file"] as! PFFile
userImageFile.getDataInBackgroundWithBlock {
(imageData: NSData?, error: NSError?) -> Void in
if error == nil {
let imageddata = UIImage(data:imageData!)
let chatBubbleData = ChatBubbleData(text: "", image:imageddata, date: object.createdAt, type: .Mine)
self.addChatBubble(chatBubbleData)
self.chatBubbleDatas.append(chatBubbleData)
}
}
}else{
let userImagefile = object["file"] as! PFFile
userImagefile.getDataInBackgroundWithBlock {
(imageData: NSData?, error: NSError?) -> Void in
if error == nil {
let imageddata = UIImage(data:imageData!)
let chatBubbleData = ChatBubbleData(text: "", image:imageddata, date: object.createdAt, type: .Opponent)
self.addChatBubble(chatBubbleData)
self.chatBubbleDatas.append(chatBubbleData)
}
}
}
}else{
if(object["senderId"] as? String == self.currentUser.objectId!){
let chatBubbleData = ChatBubbleData(text: object["text"] as? String, image:nil, date: object.createdAt, type: .Mine)
self.addChatBubble(chatBubbleData)
self.chatBubbleDatas.append(chatBubbleData)
}else{
let chatBubbleData = ChatBubbleData(text: object["text"] as? String, image:nil, date: object.createdAt, type: .Opponent)
self.addChatBubble(chatBubbleData)
self.chatBubbleDatas.append(chatBubbleData)
}
}
}
}
}
} else {
print("Error: \(error!) \(error!.userInfo)")
}
}
self.messageCointainerScroll.contentSize = CGSizeMake(CGRectGetWidth(messageCointainerScroll.frame), lastChatBubbleY + internalPadding)
self.addKeyboardNotifications()
}
工作一切良好,除了事实的消息视图不按照正确的顺序列出的所有消息。实际上,所有的短信都是按照正确的顺序排列的,但无论情况如何,无论创建的日期如何,消息图像总是会出现。我认为它必须加载一些东西;但我知道迅速,我不完全确定。任何关于修复或参考的见解请分享!
我的第一个猜测是,它与您的通话安置办主队列操作做: dispatch_async(dispatch_get_main_queue()) {
你可能只是想这样做,当你需要更新的最终用户界面。问题是,花费较长时间的操作可能会在整个块在后台运行时花费较少时间(在不同的队列上,因此您不知道调度是什么主队列...)。
经过进一步的检查看来你有一大堆的其他背景的块例如为: userImagefile.getDataInBackgroundWithBlock
我写这样的代码使用解析和JSQMessagesViewController我以为是你在做什么内部调用。我强烈建议您找到解决方案,通过网络将您的用户界面更新与模型更新分离。你现在所拥有的不仅难以调试,而且可能导致你的问题难以检测异步方式。
它实际上使用query.orderByAscending("createdAt")
来获取对象。只需在query.findObjectsInBackgroundWithBlock
的内部添加print(objects)
,您就可以看到以正确顺序打印的所有对象。
不正确的顺序是加载图像的结果。当你得到一个文本对象时,你立即追加数据。但是,当对象是图像时,您可以调用userImageFile.getDataInBackgroundWithBlock
,它在调用附加数据的块之前下载图像。
你需要做的是为图像添加一个占位符,使其位于正确的位置,然后在图像完成下载时进行更新。
作为一个侧面说明,你可能想看看subclassing PFObject
,这将摆脱所有as?
if语句和摆脱Pyramid of Doom的。
有趣但占位符会在哪里发挥作用?会在之前? userImageFile.getDataInBackgroundWithBlock肯定会尝试玩这个谢谢! –
是的,'userImageFile.getDataInBackgroundWithBlock'增加了一个延迟,这会扰乱订单。在此之前添加占位符不会有任何延迟。 –
谢谢你非常感谢生病尝试看看它是否工作 –
感谢您的建议,真的很感激!我一定会尝试通过网络玩弄UI更新和模型更新 –