2015-11-05 49 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