我所做的基本上就是解決這類問題是這樣的:
而不是使用它符合JSQMessageData我使用一種叫做視圖模型CoreData對象。
甲視圖模型基本上是一個正常NSObject的剛剛從CoreData對象解包的所有必要信息,並且符合JSQMessageData協議 - 提供文本,senderId,以及其他信息(以及媒體消息,如果必要的話)
@interface ChatMessageViewModel : NSObject <JSQMessageData>
@property (nonatomic, strong, readonly) CDChatMessage *chatMessage;
// main properties
@property (nonatomic, copy, readonly) NSString *text;
@property (nonatomic, copy, readonly) NSString *senderId;
@property (nonatomic, copy, readonly) NSString *watcherId;
...
@property (nonatomic, strong, readonly) JSQMessage *mediaMessage;
- (instancetype)initWithChatMessage:(CDChatMessage *)chatMessage;
@end
.m文件看起來是這樣的:
@interface ChatMessageViewModel()
@property (nonatomic, strong, readwrite) CDChatMessage *chatMessage;
// main properties
@property (nonatomic, copy, readwrite) NSString *text;
@property (nonatomic, copy, readwrite) NSString *senderId;
@property (nonatomic, copy, readwrite) NSString *watcherId;
...
@property (nonatomic, strong, readwrite) JSQMessage *mediaMessage;
@end
@implementation ChatMessageViewModel
- (instancetype)initWithChatMessage:(CDChatMessage *)chatMessage
if (self = [super init]) {
_chatMessage = chatMessage;
[self unpackViewModel];
}
return self;
}
- (void)unpackViewModel {
self.senderId = self.chatMessage.senderId;
self.text = self.chatMessage.senderId;
self.mediaMessage = [self unpackMediaData];
}
- (JSQMessage *)unpackMediaData {
// Here CDCustomPhotoMediaItem is a subclass of JSQPhotoMediaItem which just lets me create custom look of JSQ media item.
JSQPhotoMediaItem *photoItem = [[CDCustomPhotoMediaItem alloc] init];
return [JSQMessage messageWithSenderId:self.senderId displayName:@"" media:photoItem];
}
我使用NSFetchResultsController我只是把所有的核心數據對象,並把它們變成一成不變的ViewModels獲取數據後。
然後在cellForItemAtIndexPath我只是把這個:
cell.mediaView = [viewModel.media mediaView];
這種方法創建僅包含由JSQ聊天庫所需的必要信息塊漂亮的不可變的包裝。另外,您可以輕鬆地爲這樣的對象編寫測試。如果你使用的是swift,你可以使用struct來實現這種目的。
希望我的回答有幫助。請詢問你是否需要更詳細的答案。 ;-)