将 JS MessageMedia 数据与核心数据一起使用
useing JSQMessageMediaData with core data
我成功地将核心数据集成到我的 JSQ 项目中,对于我的 JSQMessageData,我使用了我创建的名为 CDChatMessage 的 NSManagedObject
@interface CDChatMessage : NSManagedObject < JSQMessageData >
@end
在我的 JSQMessagesViewController 中,我使用 NSfetchedresultsController,
它适用于短信,但我不知道如何实现媒体消息。
JSQMessage.h 有一个 属性 表示媒体数据
@property (copy, nonatomic, readonly) id< JSQMessageMediaData > media;
但显然我不能将 JSQMessageMediaData 类型的 属性 刺杀到我的 NSManagedObject,
有人有将 JSQMessageMediaData 与 Core Data 一起使用的解决方案吗?
谢谢。
基本上我解决这类问题的方法是:
我没有使用符合 JSQMessageData 的 CoreData 对象,而是使用了一种叫做 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,您可以将结构用于此类目的。
希望我的回答对您有所帮助。请询问您是否需要更详细的答案。 ;-)
我成功地将核心数据集成到我的 JSQ 项目中,对于我的 JSQMessageData,我使用了我创建的名为 CDChatMessage 的 NSManagedObject
@interface CDChatMessage : NSManagedObject < JSQMessageData >
@end
在我的 JSQMessagesViewController 中,我使用 NSfetchedresultsController,
它适用于短信,但我不知道如何实现媒体消息。
JSQMessage.h 有一个 属性 表示媒体数据
@property (copy, nonatomic, readonly) id< JSQMessageMediaData > media;
但显然我不能将 JSQMessageMediaData 类型的 属性 刺杀到我的 NSManagedObject, 有人有将 JSQMessageMediaData 与 Core Data 一起使用的解决方案吗?
谢谢。
基本上我解决这类问题的方法是:
我没有使用符合 JSQMessageData 的 CoreData 对象,而是使用了一种叫做 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,您可以将结构用于此类目的。
希望我的回答对您有所帮助。请询问您是否需要更详细的答案。 ;-)