如何从用户的blob ID给对话框照片?

我正在使用QuickBlox,我上传了用户个人资料图片中说,在栈上stream( 如何上传用户configuration文件图片和如何从其他用户设备获取该configuration文件图片? )它工作正常。

然后,我可以在user2联系人中看到user1个人资料图片(通过下载user1的blob文件并将其转换为图片)

但现在我的问题是,如果我们想创build一个新的聊天对话框与user1和user2login。在那里我应该链接这个user1的个人资料图片(这是上传在上面的堆栈上stream示例)与新的对话框我将创build与user1聊天。

问题:1 – 那么如何将这个用户的个人资料图片与新创build的聊天对话链接起来,特别是在一对一聊天的情况下(私人聊天)。

问题:2 – 在聊天对话框中的图像应该能够更新每当user1已更改他的个人资料图片(使用更新blob API调用)。 我们可以在WhatsApp中看到。

在,

问题:1

如果我明白你的问题,当你创build一个对话框为两个用户,你要显示在你的对话框列表中的对话框图像和对话框图像应该是其他用户的图像正确我的意思是user1应该看到对话框图像作为用户2和用户2应该看到对话框图像为User1正确?

如果是的话,哥们对不起! 但是你所遵循的方法是错误的:)对话框的属性对于用户来说都是相同的。 所以如果你设置对话框的图像为User1,user2将会看到User1图片,但是User1也会看到他自己的图片,这是错误的:)

我所要解决的是,不要使用任何图像或名称的对话框本身,除非它是一个组对话:)

每次你收到一个QBChat你将拥有身份证的人在里面。 如果QBChatPrivate消息占用者ID的数量将是2,其中一个将是您自己的ID。 所以删除会给你其他用户的ID。

每次我收到一条消息,我会发现参与其中的参与者除了我自己以外,在向coredata插入消息并在应用程序中显示消息之前,我检查我的coredata以查找用户是否存在于本地数据库中。 如果用户存在,我会获取有关用户的所有信息,如他的个人资料图片,名称和一切显示他的个人资料图片和他的名单在列表中。 否则,我将使用他的ID下载关于用户的所有信息,然后将其插入到数据库,最后将消息插入数据库。 现在,当我显示它时,我将按照相同的程序,在对话框列表中显示用户的名字他的个人资料图片和最后一条消息。

这给对话框显示其他用户名和他的个人资料图片的感觉。 但实际上对话从来没有任何形象或私人对话的名称:)

结论

不要保存任何图像或名称的ABChatDialog本身的情况下,私人对话:)

问题2

WhatsApp中的图像更新不仅涉及客户端逻辑,还包括来自服务器的支持。 不幸的是,你没有从服务器那里得到这样的支持,在那里服务器向所有客户端发出通知,告知关于configuration文件图片的变化 让我们希望Quickblox很快实现它。

我们用一个简单的方法来处理,每次用户进入对话框列表屏幕,我们把当前所有对话框中涉及的所有用户都看到,并为每个用户创build一个单独的NSOperation,并获取包括他的名字在内的所有信息,保持用户更新的所有时间:)

在我们的应用程序,我们提供了用户可以更改他的名字,所以这是重要的,我们更新用户完全不只是他的个人资料图片:)

所有在后台线程中运行的操作保持主线程空闲,并在后台更新coredata。

使用NSFetchedResultsController和coredata允许我们更新用户名和他的个人资料照片。

当您打开一个特定的用户信息时也会发生同样的过程。 我们会在您打开邮件后立即获取并更新该特定用户的信息。

这涉及到多余的服务器调用,我们几乎意识到这一点,但是这种方法始终保持用户信息的更新。

编辑根据您的要求,为您提供一点代码:)这里是一个非常抽象的不完全工作的代码,但我相信它应该给你良好的开端:)

问题1:这个代码给你想法如何添加用户之前添加聊天本身:)

 - (void)processMessage:(QBChatMessage *)message{ // processMessage method is called in background thread so creating a background managed object context for the queue. You can make use of performBlock as well //once you recieve message check if dialog exists in your db or not NSManagedObjectContext *privateManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; [privateManagedObjectContext setParentContext:appdelegate.managedObjectContext]; NSFetchRequest *request=[[NSFetchRequest alloc] initWithEntityName:@"Dialog"]; NSPredicate *predicate=[NSPredicate predicateWithFormat:@"id == %@",message.dialogID]; [request setPredicate:predicate]; NSArray *results=[privateManagedObjectContext executeFetchRequest:request error:nil]; if([results count]>0){ //once dialog found for the chat Dialog *updatedDialog=(Dialog *)[results objectAtIndex:0]; // involves is a one to many relation ship between user and dialog NSPredicate *userExistsPredicate=[NSPredicate predicateWithFormat:@"recipient_Id = %@",[NSNumber numberWithInteger:message.senderID]]; NSArray *foundUserArray=[[updatedDialog.involves allObjects] filteredArrayUsingPredicate:userExistsPredicate]; if([foundUserArray count] > 0){ //user exists in db //check if its a duplicate chat sometime same chat comes back specially in group chat NSFetchRequest *request=[[NSFetchRequest alloc] initWithEntityName:@"Chats"]; NSPredicate *predicate=[NSPredicate predicateWithFormat:@"chat_Id == %@",message.ID]; [request setPredicate:predicate]; NSArray *results=[privateManagedObjectContext executeFetchRequest:request error:nil]; if([results count] ==0){ //message not in db Chats *recievedChat=[NSEntityDescription insertNewObjectForEntityForName:@"Chats" inManagedObjectContext:privateManagedObjectContext]; recievedChat.sender_Id=[NSNumber numberWithInteger:message.senderID]; recievedChat.date_sent=message.dateSent; recievedChat.chat_Id=message.ID; recievedChat.belongs=updatedDialog; recievedChat.message_Body=message.text; //populate the way you want it //commit background context use perform block for better performance NSError *updateDialogError = nil; [privateManagedObjectContext save:&updateDialogError]; dispatch_async(dispatch_get_main_queue(), ^{ //commit main context [appdelegate.managedObjectContext save:nil]; }); } } else{ //fetch user not in db [QBRequest usersWithIDs:@[[NSNumber numberWithInteger:message.senderID]] page:nil successBlock:^(QBResponse *response, QBGeneralResponsePage *page, NSArray *users) { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ NSManagedObjectContext *privateManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; [privateManagedObjectContext setParentContext:appdelegate.managedObjectContext]; NSFetchRequest *request=[[NSFetchRequest alloc] initWithEntityName:@"Dialog"]; NSPredicate *predicate=[NSPredicate predicateWithFormat:@"id == %@",message.dialogID]; [request setPredicate:predicate]; NSArray *results=[privateManagedObjectContext executeFetchRequest:request error:nil]; Dialog *updatedDialog=[results objectAtIndex:0]; NSMutableArray *occupants=[[NSMutableArray alloc] init]; //create user for(QBUUser *user in users){ if(user.ID != appdelegate.currentUser.ID){ Recipient *recipient=[NSEntityDescription insertNewObjectForEntityForName:@"Recipient" inManagedObjectContext:privateManagedObjectContext]; recipient.recipient_Name=user.fullName; recipient.recipient_Id=[NSNumber numberWithInteger:user.ID]; [occupants addObject:recipient]; } } NSMutableArray *newUsersArray=[NSMutableArray arrayWithArray:[updatedDialog.involves allObjects]]; [newUsersArray addObjectsFromArray:occupants]; updatedDialog.involves=[NSSet setWithArray:newUsersArray]; NSFetchRequest *chatRequest=[[NSFetchRequest alloc] initWithEntityName:@"Chats"]; NSPredicate *chatPredicate=[NSPredicate predicateWithFormat:@"chat_Id == %@",message.ID]; [chatRequest setPredicate:chatPredicate]; NSArray *chatResults=[privateManagedObjectContext executeFetchRequest:chatRequest error:nil]; //add chat if([chatResults count] ==0){ //add chats or messages Chats *recievedChat=[NSEntityDescription insertNewObjectForEntityForName:@"Chats" inManagedObjectContext:privateManagedObjectContext]; recievedChat.sender_Id=[NSNumber numberWithInteger:message.senderID]; recievedChat.date_sent=message.dateSent; recievedChat.chat_Id=message.ID; recievedChat.belongs=updatedDialog; recievedChat.message_Body=message.text; } //save context NSError *updateDialogError = nil; [privateManagedObjectContext save:&updateDialogError]; dispatch_async(dispatch_get_main_queue(), ^{ //commit main context [appdelegate.managedObjectContext save:nil]; }); }); }]; } } } 

问题2你不需要代码:)一旦你通过教程我已经表明你会明白NSOperation如何工作:)然后只需在NSOperation中写quickblox api来为你下载图像:)

我希望我明确expression我的观点。 快乐的编码