В основном то, что я сделал, чтобы решить такого рода вопрос заключается в следующем:
Вместо использования объекта CoreData, которая соответствует JSQMessageData я использую то, что называется ViewModel.
ViewModel в основном нормальный 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 для этой цели.
Надеюсь, что мой ответ поможет. Пожалуйста, спросите, нужен ли вам более подробный ответ. ;-)