酒店神不知鬼不觉中设置到零
-
20-12-2019 - |
题
我试图实施一个聊天功能在我的应用程序,使用领域。io作为一个内部数据库,用以储存聊天的消息,并PubNub发送和接收信息。我ChatSessions,其定义的渠道的消息都发送过来,ChatMessages,这表示自己的消息,并保持参考文本信息,日期的消息发送的名字发送者的信息,并ChatSession的消息是一个组成部分。
在下面的代码,我的初始化ChatMessage从PNMessage收到的通道,与所有领域被指定的。这个问题我有的是,当领域转到编写信息的数据库,该会议领域的ChatMessage设置为零,尽管这一权利之前的写法是称,本届会议领域拥有一个有效的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.会议日志的正确我想要什么。该chatMessage具有正确届会议的名称。然而,只在writeToDefaultRealm:正确记录的信息的文本,但记录为零值届会议。会话.
没有人知道为什么这个会议场正在设置到零?谢谢你
编辑
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
酒店(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) {
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;
}
}
不隶属于 StackOverflow