首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用JSQMessage下载后很难让媒体替换占位符

使用JSQMessage下载后很难让媒体替换占位符
EN

Stack Overflow用户
提问于 2015-03-26 23:02:29
回答 2查看 1.8K关注 0票数 0

我正在使用JSQMessage,在正确下载之前显示媒体的占位符有点困难,然后用媒体替换它。只要把消息和媒体添加到服务器上,我就不能让它替换占位符。

目前,我有一个函数,它查询我的数据库,为消息提取一个对象数组,然后循环遍历,并对每个对象调用这个函数来输出并将其添加到我的消息线程。我很难弄清楚为什么"messageToAdd.isMediaMessage“部分没有在从服务器下载之后用实际媒体替换占位符。有谁知道我应该如何处理这个问题,以确保它用占位符添加消息,然后在媒体正确下载后进行替换?

代码语言:javascript
复制
- (void)addMessage:(PFObject *)object
{
    id<JSQMessageMediaData> messageMedia = nil;
    PFObject *user = object[@"messageSender"];
    [users addObject:user];
    NSString *name = @"";
    if(user[@"profileFName"] && user[@"profileLName"])
        name= [NSString stringWithFormat:@"%@ %@",user[@"profileFName"],user[@"profileLName"]];
    else
        name= [NSString stringWithFormat:@"%@ %@",user[@"consultantFName"],user[@"consultantLName"]];

    if([object[@"messageFileType"] isEqual: @"video"]){
        JSQVideoMediaItem *messageMedia = [[JSQVideoMediaItem alloc] init];
        messageMedia.fileURL = nil;
        messageMedia.isReadyToPlay = NO;
        messageToAdd = [JSQMessage messageWithSenderId:user.objectId displayName:name media:messageMedia];

    } else if ([object[@"messageFileType"] isEqual: @"image"]){
        JSQPhotoMediaItem *messageMedia = [[JSQPhotoMediaItem alloc] init];
        messageMedia.image = nil;
        messageToAdd = [JSQMessage messageWithSenderId:user.objectId displayName:name media:messageMedia];

    } else{
        messageToAdd= [[JSQMessage alloc] initWithSenderId:user.objectId senderDisplayName:name date:object[@"sendDate"] text:object[@"messageContent"]];
    }
    if(isLoadMore)
        [messages insertObject:messageToAdd atIndex:0];
    else
        [messages addObject:messageToAdd];

   // NOT TRIGGERING THESE AFTER MEDIA DOWNLOADED
    if (messageToAdd.isMediaMessage) {
        dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){
            if ([object[@"messageFileType"] isEqual: @"image"]){
                [object[@"messageMedia"] getDataInBackgroundWithBlock:^(NSData *imageData, NSError *error) {
                    if (!error) {
                        JSQPhotoMediaItem *photoItem = [[JSQPhotoMediaItem alloc] initWithImage:[UIImage imageWithData:imageData]];
                        ((JSQPhotoMediaItem *)messageMedia).image = [UIImage imageWithCGImage:photoItem.image.CGImage];
                        [self.collectionView reloadData];
                    }
                }];
            }
            else if([object[@"messageFileType"] isEqual: @"video"]){
                PFFile *videoFile = object[@"messageMedia"];
                NSURL *videoURL = [NSURL URLWithString:videoFile.url];
                ((JSQVideoMediaItem *)messageMedia).fileURL = videoURL;
                ((JSQVideoMediaItem *)messageMedia).isReadyToPlay = YES;
                [self.collectionView reloadData];
            }
            else {
                NSLog(@"%s error: unrecognized media item", __PRETTY_FUNCTION__);
            }
        });
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-27 19:58:08

对于其他提出相同问题/问题的人,我通过查看项目NotificationChat:https://github.com/relatedcode/NotificationChat/blob/master/NotificationChat/Classes/Chat/ChatView.m,解决了它是如何工作的。它非常好地概述了JSQMessage平台的使用情况。

这是我修改的函数,这样你就可以看到成品了。

代码语言:javascript
复制
- (void)addMessage:(PFObject *)object
{
    PFObject *user = object[@"messageSender"];
    [users addObject:user];

    PFFile *mediaMessage = object[@"messageMedia"];

    NSString *name = @"";
    if(user[@"profileFName"] && user[@"profileLName"])
        name= [NSString stringWithFormat:@"%@ %@",user[@"profileFName"],user[@"profileLName"]];
    else
        name= [NSString stringWithFormat:@"%@ %@",user[@"consultantFName"],user[@"consultantLName"]];

    if([object[@"messageFileType"] isEqual: @"video"]){
        JSQVideoMediaItem *mediaItem = [[JSQVideoMediaItem alloc] initWithFileURL:[NSURL URLWithString:mediaMessage.url] isReadyToPlay:YES];
        mediaItem.appliesMediaViewMaskAsOutgoing = [user.objectId isEqualToString:self.senderId];
        messageToAdd = [[JSQMessage alloc] initWithSenderId:user.objectId senderDisplayName:name date:object.createdAt media:mediaItem];

    } else if ([object[@"messageFileType"] isEqual: @"image"]){
        JSQPhotoMediaItem *mediaItem = [[JSQPhotoMediaItem alloc] initWithImage:nil];
        mediaItem.appliesMediaViewMaskAsOutgoing = [user.objectId isEqualToString:self.senderId];
        messageToAdd = [[JSQMessage alloc] initWithSenderId:user.objectId senderDisplayName:name date:object.createdAt media:mediaItem];

        [mediaMessage getDataInBackgroundWithBlock:^(NSData *imageData, NSError *error)
         {
             if (error == nil)
             {
                 mediaItem.image = [UIImage imageWithData:imageData];
                 [self.collectionView reloadData];
             }
         }];


    } else{
        messageToAdd= [[JSQMessage alloc] initWithSenderId:user.objectId senderDisplayName:name date:object[@"sendDate"] text:object[@"messageContent"]];
    }
    if(isLoadMore)
        [messages insertObject:messageToAdd atIndex:0];
    else
        [messages addObject:messageToAdd];

}
票数 1
EN

Stack Overflow用户

发布于 2015-03-27 02:23:34

基于代码,我认为一个可能的原因是在后台线程上成功地和异步地下载数据后,在主(UI)线程上需要reloadData

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29290424

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档