سؤال

أحاول تنفيذ ميزة الدردشة في طلبي ، باستخدام Realm.io كقاعدة بيانات داخلية لتخزين رسائل الدردشة ، وبوبنوب لإرسال واستقبال الرسائل.لدي جلسات الدردشة ، التي تحدد القنوات التي يتم إرسال الرسائل عبر ، ورسائل الدردشة ، والتي تمثل الرسائل نفسها ، وعقد إشارات إلى نص الرسالة ، وتاريخ إرسال الرسالة ، واسم مرسل الرسالة ، و جلسة الدردشة التي الرسالة جزء منها.

في التعليمات البرمجية التالية ، أنا تهيئة تشاتمسيج من ينمسيج وردت عبر القناة ، مع تحديد جميع الحقول.المشكلة التي أواجهها هي أنه عندما يذهب المجال لكتابة الرسالة إلى قاعدة البيانات ، يتم تعيين حقل جلسة تشاتمسيج إلى لا شيء ، على الرغم من حقيقة أنه قبل استدعاء طريقة الكتابة مباشرة ، يحتوي حقل الجلسة على تشاتسيون صالح محدد.

- (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];
}

نسلوغ الحق بعد وضع تشاتمسيج.تسجل الجلسة بشكل صحيح ما أريد.تحتوي رسالة الدردشة على اسم الجلسة الصحيح.ومع ذلك ، فإن نسلوغ داخل وريتدودولتريلم:يسجل نص الرسالة بشكل صحيح ، ولكن يسجل قيمة لا شيء للجلسة.اسم الجلسة.

لا أحد يعرف لماذا يتم تعيين هذا المجال الدورة إلى لا شيء?يعطيكم الصّحة

تحرير

رسالة الدردشة.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)

جلسة الدردشة.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)
هل كانت مفيدة؟

المحلول

عالم لا يدعم حاليا تعيين إلى خاصية رلموبيجيكت خارج معاملة الكتابة.لذلك عندما تفعل 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;
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top