2015-09-27 60 views
0

我成功地在我的JSQ項目集成的核心數據,我JSQMessageData我使用NSManagedObject我創建了名爲CDChatMessage期運用JSQMessageMediaData與核心數據

@interface CDChatMessage : NSManagedObject <JSQMessageData> 
@end 

我JSQMessagesViewController我使用NSfetchedresultsController,
它工作正常的短信但我無法弄清楚如何實現媒體消息。

JSQMessage.h有代表媒體數據

@property (copy, nonatomic, readonly) id<JSQMessageMediaData> media; 

但顯然我不能刺客型JSQMessageMediaData的屬性,以我的NSManagedObject, 人有使用JSQMessageMediaData核心數據的解決方案的屬性?

謝謝。

回答

2

我所做的基本上就是解決這類問題是這樣的:

而不是使用它符合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來實現這種目的。

希望我的回答有幫助。請詢問你是否需要更詳細的答案。 ;-)