문제

Chat 메시지를 저장하고 수신하는 PubNub를 내부 데이터베이스로 사용하여 realm.io를 사용하여 내 응용 프로그램에서 채팅 기능을 구현하려고합니다. 메시지가 전송되는 채널을 정의하고 메시지 자체를 나타내는 채널을 정의하고 메시지의 텍스트, 메시지가 전송 된 날짜, 메시지의 보낸 날짜, 메시지의 이름, 메시지의 이름에 대한 참조를 보관하는 채팅 항목이 있습니다. 메시지가 그 일부인 채팅은.

다음 코드에서는 모든 필드가 지정된 채널에서 수신 된 PnMessage에서 ChatMessage를 초기화하고 있습니다. Realm이 데이터베이스에 메시지를 작성하게되면 ChatMessage의 세션 필드가 NIL로 설정되어 있으므로 Write 메서드가 호출되기 전에 세션 필드에 유효한 Chatsession이 지정됩니다.

- (void)createChatMessageFromMessage:(PNMessage *)message
{
    NSDictionary *msgDict = message.message;
    ChatMessage *chatMessage = [[ChatMessage alloc] init];
    chatMessage.text = [msgDict objectForKey:@"text"];
    chatMessage.dateSent = [NSDate dateWithTimeIntervalSinceReferenceDate:[[msgDict objectForKey:@"dateSent"] floatValue]];
    chatMessage.sender = [msgDict objectForKey:@"sender"];
    NSPredicate *sessionPredicate = [NSPredicate predicateWithFormat:@"sessionName = %@", [msgDict objectForKey:@"session"]];
    RLMArray *matches = [ChatSession objectsWithPredicate:sessionPredicate];
    if ([matches count] == 1) {
        chatMessage.session = [matches firstObject];
        NSLog(@"Added chatMessage with session name: %@", chatMessage.session.sessionName);
    } else {
        NSLog(@"Error: ChatSession with name %@ not found in db.", [msgDict objectForKey:@"session"]);
        return;
    }
    [NSThread detachNewThreadSelector:@selector(writeToDefaultRealm:) toTarget:self  withObject:chatMessage];
}

#pragma mark - Saving to Realm

- (void)writeToDefaultRealm:(RLMObject *)object
{
    RLMRealm *defaultRealm = [RLMRealm defaultRealm];
    [defaultRealm beginWriteTransaction];
    [defaultRealm addObject:object];
    if ([object isKindOfClass:[ChatMessage class]]) {
        [((ChatMessage *)object).session.messages addObject:object];
        NSLog(@"Wrtiting message with text: %@ with session name: %@", ((ChatMessage *)object).text, ((ChatMessage *)object).session.sessionName);
    } else {
        NSLog(@"Writing session with name: %@", ((ChatSession *)object).sessionName);
    }
    [defaultRealm commitWriteTransaction];
}
.

chatmessage.session을 설정 한 후에 nslog 오른쪽으로 올바르게 로그가 올바르게 로그됩니다. ChatMessage에는 올바른 세션 이름이 있습니다. 그러나 WRITETODEFAULTREALM 내의 nslog : 메시지 텍스트를 올바르게 기록하지만 Session.SessionName에 대한 nil 값을 기록합니다.

이 세션 필드가 NIL로 설정되는 이유를 알고있는 사람이 있습니까? 고맙습니다

편집

chatmessage.h

#import <Realm/Realm.h>

@class ChatSession;

@interface ChatMessage : RLMObject
// Add properties here to define the model
@property NSString *text;
@property NSDate *dateSent;
@property NSString *sender;
@property ChatSession *session;

@end

// This protocol enables typed collections. i.e.:
// RLMArray<ChatMessage>
RLM_ARRAY_TYPE(ChatMessage)
.

Chatsession.h

#import "ChatMessage.h"
#import <Realm/Realm.h>

@interface ChatSession : RLMObject

// Add properties here to define the model
@property NSDate *dateOpened;
@property NSDate *dateUpdated;
@property NSString *sessionName;
@property NSString *myAlias;
@property NSString *theirAlias;
@property RLMArray<ChatMessage> *messages;

@end

// This protocol enables typed collections. i.e.:
// RLMArray<ChatSession>
RLM_ARRAY_TYPE(ChatSession)
.

도움이 되었습니까?

해결책

영역은 현재 쓰기 트랜잭션 외부의 RLMObject 속성에 할당을 지원하지 않습니다.따라서 chatMessage.session = [matches firstObject];sessionRLMObject 속성 (generacodicicetagcode)이므로 쓰기 트랜잭션에서 수행해야합니다.가능한 해결책은 다음과 같습니다.

- (void)createChatMessageFromMessage:(PNMessage *)message
{
    NSDictionary *msgDict = message.message;
    ChatMessage *chatMessage = [[ChatMessage alloc] init];
    chatMessage.text = [msgDict objectForKey:@"text"];
    chatMessage.dateSent = [NSDate dateWithTimeIntervalSinceReferenceDate:[[msgDict objectForKey:@"dateSent"] floatValue]];
    chatMessage.sender = [msgDict objectForKey:@"sender"];
    NSPredicate *sessionPredicate = [NSPredicate predicateWithFormat:@"sessionName = %@", [msgDict objectForKey:@"session"]];
    RLMArray *matches = [ChatSession objectsWithPredicate:sessionPredicate];
    if ([matches count] == 1) {
        RLMRealm *defaultRealm = [RLMRealm defaultRealm];
        [defaultRealm beginWriteTransaction];
        chatMessage.session = [matches firstObject];
        [chatMessage.session.messages addObject:chatMessage];
        [defaultRealm addObject:chatMessage];
        [defaultRealm commitWriteTransaction];
        NSLog(@"Added chatMessage with session name: %@", chatMessage.session.sessionName);
    } else {
        NSLog(@"Error: ChatSession with name %@ not found in db.", [msgDict objectForKey:@"session"]);
        return;
    }
}
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top