簡體   English   中英

將自定義NSArray數據保存到iPhone

[英]Saving Custom NSArray Data to iPhone

我一直在嘗試(通過NSUserDefaults)在本地保存用戶創建的PFGeoPoints的NSMutableArray 經過大量的閱讀和研究,我現在知道坦率地說不可能簡單地保存帶有自定義數據的數組。 我以幾種不同的方式嘗試了以下方法:

   NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
   NSMutableArray *testArray = [[NSMutableArray alloc] init];
   NSArray *checkArray = [[NSArray alloc] init];

   testArray = locationList;
   PFGeoPoint *test = [locationList objectAtIndex:0];
   NSString *latString = [NSString stringWithFormat:@"%f",test.latitude];
   [testArray insertObject:latString atIndex:0];

   checkArray = testArray;

   [defaults setValue:checkArray forKey:@"Locations"];
   [defaults synchronize];

其中locationList是已創建的NSMutableArray ,並已從Parse設置為PFGeoPoints。

我也嘗試通過將NSMutableArray轉換為NSData

    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:array];

,但這仍然沒有效果。 每次我不斷收到錯誤告訴我以下內容:

Property list invalid for format: 200 
(property lists cannot contain objects of type 'CFType')

我要保存的NSMutableArray是一個包含多個PFGeoPoint的列表。 我要做的就是將這個數組保存到設備中,這樣用戶每次加載應用程序時都不必重新創建(呈現)整個列表(我正在使用雲數據...也不想花費太多)大量用於數據)

如果有人可以就如何將這些數據保存為數組提供建議/解決方案(而不是將每一行都分為lat和long的整數),或者有人可以建議NSUserDefaults替代NSUserDefaults (例如Core)數據或其他一些本地存儲),我將不勝感激。 謝謝

要將自定義對象保存為用戶默認值,它需要符合NSCoding協議(對象需要進行編碼/解碼)。

您的自定義對象需要實現NSCoding協議。

一旦遵循NSCoding規則; 像這樣存檔和保存數據:

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:yourArray];
[[NSUserDefaults standardUserDefaults] setObject:data forKey:@"Key"];

像這樣取消存檔:

NSArray *array= [NSKeyedUnarchiver unarchiveObjectWithData:[[NSUserDefaults standardUserDefaults] objectForKey:@"Key"];

只需實現NSCoding protocol

寫數組:

OBJ-C

-(void)writeArrayWithCustomObjToUserDefaults:(NSString *)keyName withArray:(NSMutableArray *)myArray {

       NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
       NSData *data = [NSKeyedArchiver archivedDataWithRootObject:myArray];
       [defaults setObject:data forKey:keyName];
       [defaults synchronize]; 

}

迅捷2.3

func writeArrayWithCustomObjToUserDefaults(keyName: String, withArray myArray: [AnyObject]) {
    var defaults = NSUserDefaults.standardUserDefaults()
    var data = NSKeyedArchiver.archivedDataWithRootObject(myArray)
    defaults.setObject(data, forKey: keyName)
    defaults.synchronize()
}

斯威夫特3.1

func writeArrayWithCustomObj(toUserDefaults keyName: String, withArray myArray: [Any]) {
    let defaults = UserDefaults.standard
    let data = NSKeyedArchiver.archivedData(withRootObject: myArray)
    defaults.set(data, forKey: keyName)
    defaults.synchronize()
}

讀取數組:

OBJ-C

-(NSArray *)readArrayWithCustomObjFromUserDefaults:(NSString*)keyName {

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSData *data = [defaults objectForKey:keyName];
    NSArray *myArray = [NSKeyedUnarchiver unarchiveObjectWithData:data];
    [defaults synchronize];
    return myArray;  
}

迅捷2.3

func readArrayWithCustomObjFromUserDefaults(keyName: String) -> [AnyObject] {
    var defaults = NSUserDefaults.standardUserDefaults()
    var data = defaults.objectForKey(keyName)!
    var myArray = NSKeyedUnarchiver.unarchiveObjectWithData(data)!
    defaults.synchronize()
    return myArray
}

斯威夫特3.1

func readArrayWithCustomObj(fromUserDefaults keyName: String) -> [Any] {
    let defaults = UserDefaults.standard
    let data: Data? = defaults.object(forKey: keyName)
    let myArray: [Any]? = NSKeyedUnarchiver.unarchiveObject(with: data!)
    defaults.synchronize()
    return myArray!
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM