2015-10-01 97 views
16

我已經在iOS中爲領域對象設置了REST API。不過,我發現在我的對象中創建一個最喜歡的標誌有問題。我創建了一個最喜歡的布爾,但是每次從API更新對象時,它都會將最愛設置爲默認值false。在這裏我希望這個標誌不被更新,因爲最喜歡的只存儲在本地。我怎樣才能做到這一點?更新對象時,防止領域覆蓋屬性

class Pet: Object{ 
    dynamic var id: Int = 1 
    dynamic var title: String = "" 
    dynamic var type: String = "" 
    dynamic var favorite: Bool = false 


    override class func primaryKey() -> String { 
     return "id" 
    } 
} 

CreateOrUpdate

let pet = Pet() 
pet.id = 2 
pet.name = "Dog" 
pet.type = "German Shephard" 


try! realm.write { 
    realm.add(pet, update: true) 
} 
+0

你是說你不想在Realm中保存'favorite'嗎?如果是這樣,那麼當動態屬性被保存在Realm中時,移除'dynamic'。 – Abhinav

+0

我的意思是'最喜歡'沒有存儲在遠程數據庫中,因此每次打開應用程序並添加新對象並根據主鍵'id'更新現有值時,它將設置最喜歡的值爲默認值('false ')。我可以避免它更新爲默認? –

+0

這很奇怪。我假定Realm中的'createOrUpdate'方法不會觸及字典中未指定的屬性。您能否將實際保存/更新API數據的示例代碼添加到Realm中? – TiM

回答

15

有兩種方法來解決這個問題:

1.使用一個被忽略的屬性:

你可以告訴境界,某財產不應該被堅持。爲了防止您的favorite財產將由領域就堅持你必須這樣做:

class Pet: Object{ 
    dynamic var id: Int = 1 
    dynamic var title: String = "" 
    dynamic var type: String = "" 
    dynamic var favorite: Bool = false 

    override class func primaryKey() -> String { 
     return "id" 
    } 

    override static func ignoredProperties() -> [String] { 
     return ["favorite"] 
    } 
} 

,或者你可以

2.執行部分更新

或者你可以告訴境界明確哪些當您更新您的Pet對象時,應更新屬性:

try! realm.write { 
    realm.create(Pet.self, value: ["id": 2, "name": "Dog", "type": "German Shepard"], update: true) 
} 

這種方式favorite屬性不會被更改。

結論

有兩種方法之間的一個很大的區別:

忽略屬性:境界無法存儲favorite財產可言。你有責任跟蹤他們。

部分更新:領域將存儲'收藏'屬性,但它不會被更新。

我想部分更新是你需要爲你的目的。

+0

你節省我的時間...謝謝 –

15

如果你想更明確的,有第三個選擇:

3.獲取當前值進行更新

// Using the add/update method 
let pet = Pet() 
pet.id = 2 
pet.name = "Dog" 
pet.type = "German Shephard" 

if let currentObject = realm.object(ofType: Pet.self, forPrimaryKey: 2) { 
    pet.favorite = currentObject.favorite 
} 

try! realm.write { 
    realm.add(pet, update: true) 
} 

// Using the create/update method 
var favorite = false 
if let currentObject = realm.object(ofType: Pet.self, forPrimaryKey: 2) { 
    favorite = currentObject.favorite 
} 

// Other properties on the pet, such as a list will remain unchanged 
try! realm.write { 
    realm.create(Pet.self, value: ["id": 2, "name": "Dog", "type": "German Shephard", "favorite": favorite], update: true) 
} 
+1

我覺得這個選項比在接受的答案更可行。 –

+0

發現這是最好的工作解決方案。解決方案1不添加該對象,解決方案2看起來像一個混亂的工作。感謝這第三個選項! – SoundShock

+0

這應該是被接受的答案。 –

0

NSUserDefaults的4(或任何其它數據存儲,真的)

我遇到了同樣的問題,我選擇了另一種更傳統的方式將數據保存到另一個數據存儲(NSUserDefaults)。就我而言,我存儲了用戶最後一次查看某個項目並將這些數據存儲在NSUserDefaults中感覺合適。我不喜歡的東西如下:

首先,定義爲您的存儲對象的唯一密鑰(self這裏正在查看和渲染的模型對象):

- (NSString *)lastViewedDateKey { 
    // Note each item gets a unique key with <className>_<itemId> guaranteeing us uniqueness 
    return [NSString stringWithFormat:@"%@_%ld", self.class.className, (long)self.itemId]; 
} 

然後,當用戶查看項,設置鍵:

- (void)setLastViewedToNow { 
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 
    [userDefaults setObject:[NSDate date] forKey:self.lastViewedDateKey]; 
    [userDefaults synchronize]; 
} 

後來,我用這樣的:

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 
NSDate *createdOnDate = <passed in from elsewhere>; 
NSDate *lastViewedDate = [userDefaults objectForKey:self.lastViewedDateKey]; 
if (!lastViewedDate || [createdOnDate compare:lastViewedDate] == NSOrderedDescending) { 
    ... 
} 

與上述解決方案相反: 1.沒有數據持久性。 2.這創造了另一個地方,人們必須定義對象的屬性,並且如果每次添加新屬性時都忘記更新此列表,則可能會導致錯誤。 3.如果您正在進行大批量更新,則通過每個對象返回都不是很實際,並且肯定會導致嚴重的後果。

我希望如果他們需要它,可以給別人一個選擇。