0

我的應用程序中保存的NSData(包含書籤的文件引用)列表NSUserDefaults的在一定程度以下的方式,在應用過程中的任何一點:NSUserDefaults的方法setObject不節能首次

NSMutableArray *bookmarkedURLs = [[NSMutableArray alloc] init]; 
[bookmarkedURLs addObject:bookmark]; // 'bookmark' is a NSData object 
[[NSUserDefaults standardUserDefaults] setObject:bookmarkedURLs forKey:@"AppBookmarks"]; 
[[NSUserDefaults standardUserDefaults] synchronize]; 

當應用程序啓動時我通過NSUserDefaults的檢查填充保存NSData的列表:

bookmarkedURLs = [[[NSUserDefaults standardUserDefaults] objectForKey:@"AppBookmarks"] mutableCopy]; 
if (bookmarkedURLs.count == 0) 
{ 
    bookmarkedURLs = [[NSMutableArray alloc] init]; 
    NSLog(@"INITIALIZED"); 
} 
else 
{ 
    NSLog(@"STORES NSDATA LIST"); 
    .... 
} 

我面對我可以在下面的工序順序的問題:

  1. 有由「AppBookmarks」鍵
  2. 保存NSData的是沒有保存的NSUserDefaults的數據NSUserDefaults的由「AppBookmarks」鍵
  3. 重新啓動應用程序
  4. 應用程序嘗試從NSUserDefaults的AppBookmarks「鍵,但始終填充的NSMutableArray發現0記錄
  5. 我又一個新的NSData保存到「AppBookmarks」鍵
  6. 重新啓動應用程序
  7. 應用程序嘗試從「AppBookmarks」,這填充的NSMutableArray它發現保存的記錄的時間。
  8. 應用程序或新的NSData除了「AppBookmarks」的任何重新啓動之後,從來沒有失敗

因此,只要沒有保存的數據和NSUserDefaults的我救了一個值,它不加載或保存的第一次。任何嘗試保存和加載的工作都是在那之後進行的。

+0

你肯定書籤是NSURL對象?據我所知,NSUserDefault只適用於包含NSData的,的NSString,NSNumber的,NSDate的,NSArray的,或者NSDictionary的陣列。 –

+0

感謝您指點。我糾正了我的問題。 –

+0

嘗試更改bookmarkedURLs = [[[[NSUserDefaults standardUserDefaults] objectForKey:@「AppBookmarks」] mutableCopy]; with:bookmarkedURLs = [NSMutableArray arrayWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:@「AppBookmarks」]]; – Ilario

回答

0

試試這個:

NSMutableArray *bookmarkedURLs = [[NSMutableArray alloc] init]; 
[bookmarkedURLs addObject:bookmark]; // 'bookmark' is a NSURL object 
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
[defaults setObject:bookmarkedURLs forKey:@"AppBookmarks"]; 
[defaults synchronize]; 

我希望這可以幫助你。

+0

謝謝;但將NSUserDefaults存儲到一個字段並使用也沒有幫助。 –

+0

你從哪裏設置'bookmarkedURLs'? –

+0

你問我如何生成'書籤'對象?這是一個NSURLBookmarkCreationWithSecurityScope的NSData對象 - 所以我在用戶選擇任何文件/文件夾時,在「NSOpenPanel」事件之後創建它,我將選定的文件路徑添加到URL書籤並獲取NSData('bookmark')對象。 –

0

你可以做這樣的事情,

 NSUserDefaults *myDefaults = [NSUserDefaults standardUserDefaults]; 

// for example 
NSURL *url1; // your url1 
NSURL *url2; // your url2 

//Set data to userdefaults 

NSMutableArray *arr = [[NSMutableArray alloc]initWithObjects:url1,url2, nil]; // Store urls directly in array 

NSData *bookMarkdata = [NSKeyedArchiver archivedDataWithRootObject:arr]; // convert whole array in data 

[myDefaults setObject:bookMarkdata forKey:@"AppBookmarks"]; // save that data object to userdefaults 
[myDefaults synchronize]; 

//Retreive data from userdefaults 

NSData *resultData = [myDefaults objectForKey:@"AppBookmarks"]; //retrieve data from user defaults 

NSMutableArray *resultArr = [NSKeyedUnarchiver unarchiveObjectWithData:resultData]; // get result array from data 
+0

'[NSKeyedUnarchiver unarchiveObjectWithData:resultData]'總是返回我null NSMutableArray,即使通過這個[[[NSKeyedUnarchiver unarchiveObjectWithData:resultData] mutableCopy]''。我可以確認,在調用'[NSKeyedArchiver archivedDataWithRootObject:bookmarkedURLs]'時,我在可變數組中有超過0個項目。 –