3

我有一個subclassed NSManagedObject符合MKAnnotation協議,它有緯度和經度的NSNumber屬性。如何在不使用setCoordinate的情況下更新註釋?

當我自己更改任何座標時,我使用setCoordinate:並更新setCoordinate:的執行內部的緯度和經度屬性。使用這種方法,地圖視圖更新註釋。但是,當我通過mergeChangesFromContextDidSaveNotification將更改與另一個NSManagedObjectContext合併時,不使用setCoordinate:因爲明確更改了經度和緯度屬性。這可以防止任何有關座標變化的KVO通知。

我試圖讓地圖視圖,實現協調與此代碼依賴於緯度和經度屬性:

+ (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key { 
    NSSet *keyPaths = [super keyPathsForValuesAffectingValueForKey:key]; 

    if ([@"coordinate" isEqualToString:key]) { 
     NSSet *affectingKeys = [NSSet setWithObjects:@"latitude", @"longitude", nil]; 
     keyPaths = [keyPaths setByAddingObjectsFromSet:affectingKeys]; 
    } 

    return keyPaths; 
} 

但是該代碼產生此故障:

終止應用程序由於未捕獲異常「NSRangeException」,原因:'無法刪除關鍵路徑的座標「的觀察者,因爲它沒有註冊爲觀察者。

上時經緯度改變如何防止碰撞或其他方法來獲得送出的座標志願通知任何想法?謝謝參觀。

回答

1

我通過更改setCoordinate:來解決此問題,以便它使用Core Data自動生成的primitive accessors來設置latitudelongitude屬性。

我懷疑,因爲我keyPathsForValuesAffectingValueForKey:作出coordinate關鍵取決於latitudelongitude鍵兩者的MKMapView是越來越迷茫的時候setCoordinate:使用的公共存取,而不是原始的存取。

當使用的公共的訪問方法來設置的緯度和經度,觀察coordinate關鍵路徑中的任何對象觀察到三個單獨的改變(關鍵路徑coordinatelatitudelongitude)時,只有一個變化(coordinate)應該遵守,這使地圖視圖混淆。

+0

另外我想指出的是,因爲'座標'不是我的'NSManagedObject'中的建模屬性,所以我不得不返回'+(BOOL)contextShouldIgnoreUnmodeledPropertyChanges'的NO,沒有這個'自從我使用基本訪問器後,NSManagedObjectContext沒有保存更改。 – 2012-02-22 23:17:26

0

這是一個小開銷,但您可以觀察latitudelongitude params(或覆蓋它們的setters),並在更改時強制設置座標(使用setCoordinate:)。

+0

我不介意開銷,但是我的'setCoordinate:'方法使用'setLatitude:'和'setLongitude:',所以會造成無限循環。 – 2012-02-21 19:53:20

+0

哦......我明白了。這很糟糕:( – 2012-02-22 06:44:16

相關問題