【问题标题】:Parse Messenger Chat Swift : Messages are out of orderParse Messenger Chat Swift:消息乱序
【发布时间】:2016-01-24 04:27:38
【问题描述】:

最近我的 ios messenger 遇到了一些问题。起初我只获取短信,一切都很完美。当我尝试从解析中获取图像时,我成功了;但是,提要的顺序不正确。 似乎它完全忽略了“query.orderByAscending”......

 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()
}

除了消息视图没有以正确的顺序显示所有消息之外,一切都运行良好。事实上,所有文本消息的顺序都是正确的,但无论是什么情况,无论创建日期如何,总是会出现消息图像。我认为它必须与加载有关;但是我知道 swift 并且我不完全确定。有关修复或参考的任何见解,请分享!

【问题讨论】:

    标签: ios swift parse-platform chat messenger


    【解决方案1】:

    我的第一个猜测是,它与您在主队列上执行操作的调用位置有关: dispatch_async(dispatch_get_main_queue()) { 您可能只想在最后需要更新用户界面时这样做。问题在于,花费较长时间的操作可能会在花费较少时间的操作之后得到处理,因为整个块都在后台运行(在不同的队列上,所以你不知道调度在主队列...)。

    经过进一步检查,您的块内似乎还有许多其他后台调用,例如: userImagefile.getDataInBackgroundWithBlock 我已经使用 Parse 和 JSQMessagesViewController 编写了这样的代码,我认为这就是你正在做的事情。我强烈建议您找到将用户界面更新与网络上的模型更新分离的方法。您现在所拥有的不仅难以调试,而且可能以某种难以检测的异步方式导致您的问题。

    【讨论】:

    • 感谢您的建议,非常感谢!我一定会尝试通过网络玩转 ui 更新和模型更新
    【解决方案2】:

    它实际上是使用query.orderByAscending("createdAt") 来获取对象。只需在query.findObjectsInBackgroundWithBlock 中添加print(objects),您应该会看到所有对象都以正确的顺序打印。

    不正确的顺序是加载图像的结果。当您获得一个文本对象时,您会立即附加数据。但是当对象是图像时,您调用 userImageFile.getDataInBackgroundWithBlock 会在调用添加数据的块之前下载图像。

    您需要做的是为图像附加一个占位符,使其位于正确的位置,然后在图像下载完成后更新它。


    作为旁注,您可能需要查看subclassing PFObject,它会删除所有as? if 语句并删除Pyramid of Doom

    【讨论】:

    • 很有趣,但是占位符会在哪里发挥作用?会是以前吗? userImageFile.getDataInBackgroundWithBlock 生病了一定要试试这个谢谢!
    • 是的,userImageFile.getDataInBackgroundWithBlock 正在添加一个延迟,这会打乱订单。在此之前添加占位符不会有延迟。
    • 非常感谢您尝试看看它是否有效
    • 很奇怪,它把图像按正确的顺序排列,但图像仍然显示在所有文本之后
    猜你喜欢
    • 1970-01-01
    • 2017-10-06
    • 1970-01-01
    • 2021-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    相关资源
    最近更新 更多