Objective c 属性神秘地设置为零

Objective c 属性神秘地设置为零,objective-c,ios7,pubnub,realm,Objective C,Ios7,Pubnub,Realm,我正在尝试在我的应用程序中实现聊天功能,使用Realm.io作为内部数据库来存储聊天消息,并使用PubNub发送和接收消息。我有ChatSessions,它定义了发送消息的通道,还有ChatMessages,它表示消息本身,并包含消息文本、消息发送日期、消息发送者的名称以及消息所属的ChatSession的引用 在下面的代码中,我正在从通过通道接收的PNMessage初始化ChatMessage,并指定所有字段。我遇到的问题是,当Realm将消息写入数据库时,ChatMessage的sessio

我正在尝试在我的应用程序中实现聊天功能,使用Realm.io作为内部数据库来存储聊天消息,并使用PubNub发送和接收消息。我有ChatSessions,它定义了发送消息的通道,还有ChatMessages,它表示消息本身,并包含消息文本、消息发送日期、消息发送者的名称以及消息所属的ChatSession的引用

在下面的代码中,我正在从通过通道接收的PNMessage初始化ChatMessage,并指定所有字段。我遇到的问题是,当Realm将消息写入数据库时,ChatMessage的session字段设置为nil,尽管在调用write方法之前,session字段指定了有效的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值

有人知道为什么将此会话字段设置为零吗?多谢各位

编辑

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)
#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
//在此处添加属性以定义模型
@属性字符串*文本;
@属性NSDate*已发送日期;
@属性NSString*发送方;
@财产聊天会议*会议;
@结束
//此协议启用类型化集合。即。:
//玛丽酒店
RLM_数组_类型(聊天信息)
ChatSession.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)
#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)
#导入“ChatMessage.h”
#进口
@接口会话:RLMObject
//在此处添加属性以定义模型
@财产NSDate*已打开日期;
@属性NSDate*日期更新;
@属性NSString*会话名称;
@属性NSString*myAlias;
@属性NSString*theirAlias;
@属性RLMArray*消息;
@结束
//此协议启用类型化集合。即。:
//玛丽酒店
RLM_阵列_类型(聊天会话)

领域当前不支持在写事务之外分配给RLMObject属性。因此,当您执行
chatMessage.session=[匹配第一个对象]
,因为
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;
    }
}

您介意同时发布
ChatSession
ChatMessage
的标题吗?当然可以。刚刚编辑过。非常感谢!现在一切都好了