2016-01-24 56 views
0

最近我一直在我的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() 
} 

工作一切良好,除了事实的消息视图不按照正确的顺序列出的所有消息。实际上,所有的短信都是按照正确的顺序排列的,但无论情况如何,无论创建的日期如何,消息图像总是会出现。我认为它必须加载一些东西;但我知道迅速,我不完全确定。任何关于修复或参考的见解请分享!

回答

0

我的第一个猜测是,它与您的通话安置办主队列操作做: dispatch_async(dispatch_get_main_queue()) { 你可能只是想这样做,当你需要更新的最终用户界面。问题是,花费较长时间的操作可能会在整个块在后台运行时花费较少时间(在不同的队列上,因此您不知道调度是什么主队列...)。

经过进一步的检查看来你有一大堆的其他背景的块例如为: userImagefile.getDataInBackgroundWithBlock 我写这样的代码使用解析和JSQMessagesViewController我以为是你在做什么内部调用。我强烈建议您找到解决方案,通过网络将您的用户界面更新与模型更新分离。你现在所拥有的不仅难以调试,而且可能导致你的问题难以检测异步方式。

+0

感谢您的建议,真的很感激!我一定会尝试通过网络玩弄UI更新和模型更新 –

0

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

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

你需要做的是为图像添加一个占位符,使其位于正确的位置,然后在图像完成下载时进行更新。


作为一个侧面说明,你可能想看看subclassing PFObject,这将摆脱所有as? if语句和摆脱Pyramid of Doom的。

+0

有趣但占位符会在哪里发挥作用?会在之前? userImageFile.getDataInBackgroundWithBlock肯定会尝试玩这个谢谢! –

+0

是的,'userImageFile.getDataInBackgroundWithBlock'增加了一个延迟,这会扰乱订单。在此之前添加占位符不会有任何延迟。 –

+0

谢谢你非常感谢生病尝试看看它是否工作 –