2015-11-05 26 views
2
class Book: Object { 
    // (…) 
    var readingSessions: [ReadingSession] { 
     return linkingObjects(ReadingSession.self, forProperty: "book") 
    } 
} 

class ReadingSession: Object { 
    // (…) 
    var book: Book? 

    var aComputedProperty: Int { 
     print(self) // Prints ReadingSession { book = Book { (…) } (…) } 
     print(self.book) // Prints nil 
     // (…) 
    } 
} 

代码几乎说明了一切。如果我从我的计算属性中打印self,它会在我期望的其他属性中打印相关对象。如果我只是试图获得该对象,但它返回nil。这是否应该发生?难道我做错了什么?领域关系返回零时,它不应该

由于提前,

丹尼尔


编辑:看来问题实际上与计算性能。只是从普通的视图控制器调用这个问题给我带来了同样的问题:

let session = ReadingSession() 
// (…) 
print(session) // This returns every property, including the Book 
print(session.book) // This returns nil 

虽然这并不总是发生。在我的代码的某些部分,我做了同样的事情,它按预期工作,在其他部分发生。所以我想我只是在某个地方犯了一个愚蠢的错误,但我不知道是什么导致了这个。


let realm = try! Realm() 

let sessions = realm.objects(ReadingSession).filter("book = %@", user.selectedBook!).sorted("date") 
let session = sessions[indexPath.row] 
print(session.book) // prints nil 
session.book = user.selectedBook! 
print(session.book) // prints the correct book 

我不明白!我正在根据Book过滤会话。当我打印过滤的会话书时,不应该返回我用来过滤它的书吗?但是,只有当我将它的书属性重新设置为同一本书时才有效!

回答

8

您必须声明user财产dynamic var,使这项工作:

class ReadingSession: Object { 
    dynamic var book: Book? 
    //... 
} 
+0

我以为我已经当我定义'无功书的关系:在我的阅读会话书',然后我用'linkingObjects'部分来定义反向关系。除此之外,我认为没有必要为list添加一个list属性。你说我除了用'linkingObjects'定义的反向关系之外还应该有另外一个阅读会话属性?另外,我的问题不是查询某个书本电话的所有会话,而是已经有效。有时无法正常工作的是从会话中查询一本书。 – dbmrq

+0

但是,正确地将书籍添加到会话中,因为当我打印(会话)时,我得到了正确的书籍。问题是当我打印(session.book)时,有时候我会得到零。我以为我甚至不需要从'Book'到'ReadingSession'的相反关系来做到这一点。我的每个'ReadingSessions'都有一个'Book',我只是想得到它。 – dbmrq

+0

啊,好的。然后我误解了你的问题。一个问题:'user.selectedBook'是什么类型?那是一个'Book'对象吗? – joern