2015-09-27 7 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 с Core Data?

спасибо.

ответ

2

В основном то, что я сделал, чтобы решить такого рода вопрос заключается в следующем:

Вместо использования объекта 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 для этой цели.

Надеюсь, что мой ответ поможет. Пожалуйста, спросите, нужен ли вам более подробный ответ. ;-)

Смежные вопросы