속성은 신비하게 숫자로 설정되었습니다
-
20-12-2019 - |
문제
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];
가 session
가 RLMObject
속성 (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;
}
}
.