2016-12-08 2 views
1

관리 된 Avatar 클래스와 관리되는 User 클래스가 있습니다. User 클래스는 Avatar 클래스에 대한 참조가 있습니다Realm addOrUpdateObject로 인해 등록 정보가 nil로 설정되는 이유는 무엇입니까?

@interface User : RLMObject 
... 
@property (nonatomic, retain) Avatar *avatar; 
... 

Avatar 클래스는 다음과 같습니다

@interface Avatar : RLMObject 
@property (nonatomic, retain) NSString *urlStr; 
@property (nonatomic, retain) NSData *imageData; 
@end 

@implementation Avatar 
+ (NSString *)primaryKey { 
    return @"urlStr"; 
} 
+ (NSArray *)requiredProperties { 
    return @[@"urlStr", @"imageData"]; 
} 
@end 

는 I의 한 새로운 사용자 가져온 경우 (예를 들어 서버에서)있다 하지만 아바타를 다시 다운로드하지 않으려면 대신 데이터베이스에서 기존 아바타를 가져오고 싶습니다. 간단하지만 db에서 [Avatar objectWithPrimaryKey]을 사용하여 기존 Avatar 참조를 가져온 후 User에 아바타 속성으로 설정 한 다음 을 호출하면 avatar 속성이 nil로 설정됩니다. 예외가 발생하지 않거나 디버그 로그가 없으면 속성은 0이 아닌 값에서 nil 값으로 변경됩니다. Avatar 테이블이 여전히 채워지지만 User 참조가 db에서 비어 있는지 확인하십시오.

코드의 일부 :

현존하는 아바타 점검 :

if let avatarURLStr = user.avatarURLStr, let avatarURL = URL(string: avatarURLStr) { 
     if let dbAvatar = Avatar(forPrimaryKey: avatarURLStr) { 
      let newAvatar = Avatar(urlStr: dbAvatar.urlStr, imageData: dbAvatar.imageData) 
      user.avatar = newAvatar 
     } else { 
      if let data = NSData(contentsOf: avatarURL) { 
       let avatar = Avatar(urlStr: avatarURLStr, imageData: data as Data!) 
       user.avatar = avatar 
      } 
     } 
    } 

DB를에 사용자 추가 : 나는 Objective-에 대한 영역 2.1.1에있어

  let realm = RLMRealm.default() 
      realm.beginWriteTransaction() 
      // user.avatar is non-nil here 
      realm.addOrUpdate(user) 
      // user.avatar is nil here 
      try? realm.commitWriteTransaction() 

을 C (그러나 프로젝트는 Swift와 Obj-C를 모두 사용함).

+0

또한 관리 객체를 참조하는 관리되지 않는 객체를 addOrUpdate해도 괜찮은지 궁금합니다. 나는 실제로 관리되지 않고 addOrUpating하는 새로운 Avatar 객체를 만들려고 시도했지만, 똑같은 문제가 발생합니다. –

답변

1

오이 ... 알아 냈습니다. 나는 약간의 질문을 단순화했고, 내가 업데이트하고 있던 객체 중 하나가 아바타가있는 다른 객체와 관계가있는 다른 객체와 관계가 있다는 것을 알게되었습니다. 그 아바타는 제로였습니다.

관련 문제