2014-03-01 80 views
1

我試圖將位置數組保存到NSUserDefaults。首先,我將CLLocationCoordinates轉換爲一個NSValues數組,並使用NSUserDefaults進行保存。 這是到目前爲止我的代碼:將NSMutable陣列保存到NSUserDefaults時出錯

_locationsArray = [[NSMutableArray alloc] init]; 
NSUInteger count = [self.locations count]; 
CLLocationCoordinate2D coordinates[count]; 
for (NSInteger i = 0; i < count; i++) { 
    coordinates[i] = [(CLLocation *)self.locations[i] coordinate]; 
    NSValue *locationValue = [NSValue valueWithMKCoordinate:coordinates[i]]; 
    [_locationsArray addObject:locationValue]; 
} 
NSLog(@"location = %@", _locationsArray); 
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 

[defaults setObject:totalDistance forKey:@"totalDistance"]; 
[defaults setObject:_locationsArray forKey:@"mapOverlay"]; 
// [defaults setDouble:_totalTime forKey:@"totalTime"]; 
[defaults setObject:avgSpeedToBeSaved forKey:@"averageSpeed"]; 
[defaults setObject:totalCalories forKey:@"totalCalories"]; 
[defaults synchronize]; 

不過,我得到以下錯誤:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSUserDefaults setObject:forKey:]: attempt to insert non-property list object (
    "<8b4df1d9 36ab4240 d5059bbe 47825ec0>", 
    "<f6dd639f 36ab4240 a2a7b7f5 49825ec0>", 
    "<f6dd639f 36ab4240 a2a7b7f5 49825ec0>", 
    "<20c46379 36ab4240 5ff02732 4c825ec0>", 
    "<20c46379 36ab4240 5ff02732 4c825ec0>", 
    "<d24c9c81 36ab4240 2bd75f9f 4e825ec0>", 
    "<d24c9c81 36ab4240 2bd75f9f 4e825ec0>", 
    "<d810b96c 36ab4240 f4d96401 51825ec0>", 
    "<d810b96c 36ab4240 f4d96401 51825ec0>" 
) for key mapOverlay' 

我想,如果我轉換的座標NSValues會被罰款保存到NSUserDefaults的 - 是那不是這種情況?我應該怎麼做呢?

+4

閱讀'NSUserDefaults'的文檔。 'NSValue'不是支持的數據類型之一。 – rmaddy

+0

相關:[爲什麼NSUserDefaults無法在iPhone SDK中保存NSMutableDictionary?](http://stackoverflow.com/questions/471830/why-nsuserdefaults-failed-to-save-nsmutabledictionary-in-iphone-sdk/471920#471920) –

+0

只是想提一個可能更簡單的替代方法:而不是NSValues,嘗試定義一個自定義類X,該類將座標保存爲NSNumber屬性。然後將X的實例添加到數組中。另一種選擇是包含座標爲NSNumbers的字典數組。 – Anna

回答

0

你爲什麼要保存NSMutableArrayNSUserDefaults。這不是保存數據的正確方法。

您應該將您的數據保存在plist文件中。

[_locationsArray writeToFile:path atomically:YES]; 

plist文件

_locationsArray=[NSMutableArray arrayWithContentsOfFile:path]; 

您還可以使用數據庫中獲取的所有位置。

+0

我認爲這可能是我的選擇,但當我嘗試從plist文件中檢索數據時,我的位置數組爲空,這裏是我正在使用的代碼:'NSString * path = [NSTemporaryDirectory()stringByAppendingPathComponent:@「ActivityCompleted。的plist「]; _locationsArray = [NSMutableArray arrayWithContentsOfFile:path];''和'NSString * path = [NSTemporaryDirectory()stringByAppendingPathComponent:@「ActivityCompleted.plist」]; _locationsArray = [NSMutableArray arrayWithContentsOfFile:path];'檢索 – Khledon

0

那麼你可以使用NSKeyedArchiever來實現你的數組,並將其設置爲userdefaults。而當你想讀取相同的unarchieve使用NSKeyedUnarchiever你的數組。

0

嘗試保存值而不是對象。

[defaults setValue:(id) forKey:(NSString *)]; 

它的工作,因爲(id)基本上可以是「任何東西」,它不會崩潰。 :)

+0

不,我仍然得到相同的錯誤,即使我保存爲一個值 – Khledon

0

以及它要求一個「屬性列表對象」這是NSDictionary/XML/Plist。嘗試將其保存到字典?

for (NSInteger i = 0; i < count; i++) { 
    coordinates[i] = [(CLLocation *)self.locations[i] coordinate]; 
    NSValue *locationValue = [NSValue valueWithMKCoordinate:coordinates[i]]; 
    [_locationsArray addObject:locationValue]; 
} 
NSMutableDictionary *locationsDict = @{@"locationsArray": _locationsArray}; 

[defaults setObject:locationsDict forKey:@"mapOverlay"]; 
[defaults synchronize]; 

讓我們知道這是否正常工作:)

+0

感謝您的建議。只是一個簡單的問題:我想保存位置數組的原因是我可以用它在下一個視圖中構建MKPolyline,我將如何從NSDictionary重建數組? – Khledon

+0

NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults]; NSMutableArray * mapOverlay = [[defaults objectForKey:@「mapOverlay」] valueForKey:@「locationsArray」]; – emotality