簡體   English   中英

我應該使用 NSUserDefaults 還是 plist 來存儲數據?

[英]Should I use NSUserDefaults or a plist to store data?

我將存儲一些字符串(可能是 10-20)。 我不確定是否應該使用 NSUserDefaults 來保存它們,或者將它們寫到 plist 中。 什么被認為是最佳實踐? NSUserDefaults 似乎代碼行數更少,因此實現起來更快。

我想補充一點,這些字符串值將由用戶添加/刪除。

我假設一個數組,但它也適用於字典。

Userdefaults、Core Data 和 Plists 都可以讀/寫,但是如果你使用 plist,你需要注意你把它放在什么目錄中。 請參閱下面的 plist 部分。

Core Data 我認為這太過分了,它只是字符串。 當您想要持久化更復雜的對象時,應該使用它。

NSUserDefaults

盡管它應該只存儲用戶設置,但它非常快速且易於操作。 要將它們寫入用戶默認值:

NSArray *stringsArray = [[NSArray alloc] arrayWithObjects: string1, string2, string3, nil];
[[NSUserDefaults standardUserDefaults] setObject:stringsArray forKey:@"MyStrings"];
[[NSUserDefaults standardUserDefaults] synchronize];

從 userdefaults 讀取:

NSArray *stringsArray = [[NSUserDefaults standardUserDefaults] objectForKey:@"MyStrings"];

列表

如果要修改您的字符串,您將需要編寫和讀取 plist,但您不能寫入應用程序的資源。

  1. 要有一個讀/寫 plist 首先找到文檔目錄

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *stringsPlistPath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"Strings.plist"];
  2. 創建數組(我假設字符串是 string1,...)

     NSArray *stringsArray = [[NSArray alloc] arrayWithObjects: string1, string2, string3, nil];
  3. 將其寫入文件

    [stringsArray writeToFile:stringsPlistPath atomically:YES];

要閱讀 plist:

  1. 找到文檔目錄

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *stringsPlistPath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"Strings.plist"];
  2. 閱讀它:

     NSArray *stringsArray = [NSArray arrayWithContentsOfFile:stringsPlistPath];

iOS 最終將所有NSUserDefaults數據存儲到一個 plist 文件中。 因此,如果這是您關心的問題,它不會影響性能。 我個人更喜歡將NSUserDefaults用於小數據,將 plist 用於相對較大的數據集。

注意:永遠不要在NSUserDefaults中存儲任何敏感信息,因為任何人都可以看到這些數據。

如果您要存儲 10-20 個字符串並且正在尋找不多的代碼行,那么核心數據肯定會產生過多的開銷。 我建議使用 plist。 代碼不多:

NSURL *plistURL = [[NSBundle mainBundle] URLForResource:@"MyStrings" withExtension:@"plist"];
NSArray *stringArray = [NSArray arrayWithContentsOfURL:plistURL];

NSUserDefaults 會將用戶首選項存儲到 Library/Preferences 文件夾中的文件中。 從理論上講,它僅用於存儲一些應用程序/用戶屬性。

Plist 文件對於管理單個文件很有用。 如果你需要管理更多,你應該使用 Coredata。 plist 文件的大小沒有限制。 否則你必須小心 plist 文件,因為當你需要保存或讀取它時,文件的全部內容將被加載到 memory 中。

如果字符串不僅僅是可以在 NSUserDefaults 中使用 go 的用戶設置,則使用 plist 是存儲字符串的不錯選擇。 如前所述,使用 plist 時,您必須將 plist 存儲在 Documents 目錄中才能寫入,因為您無法寫入自己應用程序的資源。 當我第一次了解到這一點時,我不清楚您自己的應用程序的 Bundle 目錄與 Documents 目錄的位置,所以我想我會在這里發布示例代碼,首先復制一個名為“Strings.plist”的 plist(即您已經在自己的應用程序的 Bundle 目錄中)復制到 Documents 目錄,然后對其進行寫入和讀取。

// Make a path to the plist in the Documents directory
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *stringsPlistPathIndDoc = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"Strings.plist"];

// Make a path to the plist in your app's Bundle directory
NSString *stringsPlistPathInBundle = [[NSBundle mainBundle] pathForResource:@"Strings" ofType:@".plist"];

NSFileManager *fileManager = [NSFileManager defaultManager];

// Check first that you haven't already copied this plist to the Documents directory
if (![fileManager fileExistsAtPath:stringsPlistPathIndDoc])
{
    NSError *error;

    // Copy the plist from the Bundle directory to the Documents directory 
    [fileManager copyItemAtPath:stringsPlistPathInBundle toPath:stringsPlistPathIndDoc error:&error];
}

// Write your array out to the plist in the Documents directory
NSMutableArray *stringsArray = [[NSMutableArray alloc] initWithObjects:@"string1", @"string2", @"string3", nil]; 
[stringsArray writeToFile:stringsPlistPathIndDoc atomically:YES];

// Later if you want to read it:
stringsArray = [[NSMutableArray alloc] initWithContentsOfFile:stringsPlistPathIndDoc];

使用.plist

  1. 使用 Xcode 創建一個 plist

將值寫入 plist

NSURL *plistURL = [[NSBundle mainBundle] URLForResource:@"settings" withExtension:@"plist"];

 NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithContentsOfURL:plistURL];
 [dict setValue:@"value" forKey:@"key"];
 [dict writeToURL:plistURL atomically:YES];

從 plist 中讀取一個值

NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithContentsOfURL:plistURL];
NSString *myValue = [dict valueForKey:@"key"];

NSUSerDefaults實現起來確實很快,但主要是隨着你的應用程序的增長,你想要存儲的越來越多,我直接去了 plist 文件。

大多數情況下,人們想要存儲一些東西的列表,所以這里是我關於如何使用 NSDictionary 做到這一點的分享。 這不需要你先創建一個plist文件,它會在第一次創建保存一些東西

xcode 7 測試版,Swift 2.0

保存

func SaveItemFavorites(items : Array<ItemFavorite>) -> Bool
{
    let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) as NSArray
    let docuDir = paths.firstObject as! String
    let path = docuDir.stringByAppendingPathComponent(ItemFavoritesFilePath)
    let filemanager = NSFileManager.defaultManager()

    let array = NSMutableArray()        

    for var i = 0 ; i < items.count ; i++
    {
        let dict = NSMutableDictionary()
        let ItemCode = items[i].ItemCode as NSString

        dict.setObject(ItemCode, forKey: "ItemCode")
        //add any aditional..
        array[i] = dict
    }

    let favoritesDictionary = NSDictionary(object: array, forKey: "favorites")
    //check if file exists
    if(!filemanager.fileExistsAtPath(path))
    {
        let created = filemanager.createFileAtPath(path, contents: nil, attributes: nil)
         if(created)
         {
             let succeeded = favoritesDictionary.writeToFile(path, atomically: true)
             return succeeded
         }
         return false
    }
    else
    {
        let succeeded = notificationDictionary.writeToFile(path, atomically: true)
        return succeeded
    }
}

文檔中的小注釋:

NSDictionary.writeToFile(path:atomically:)

此方法在寫出文件之前遞歸地驗證所有包含的對象都是屬性列表對象( NSDataNSDateNSNumberNSStringNSArrayNSDictionary的實例),如果所有對象都不是屬性列表對象,則返回 NO,因為結果文件不是有效的屬性列表。

因此,無論您在dict.SetObject()設置什么,都應該是上述類型之一。

加載

private let ItemFavoritesFilePath = "ItemFavorites.plist"

func LoadItemFavorites() -> Array<ItemFavorite>
{
    let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) as NSArray
    let docuDir = paths.firstObject as! String
    let path = docuDir.stringByAppendingPathComponent(ItemFavoritesFilePath)
    let dict = NSDictionary(contentsOfFile: path)
    let dictitems : AnyObject? = dict?.objectForKey("favorites")

    var favoriteItemsList = Array<ItemFavorite>()

    if let arrayitems = dictitems as? NSArray
    {
        for var i = 0;i<arrayitems.count;i++
        {
            if let itemDict = arrayitems[i] as? NSDictionary
            {
                let ItemCode = itemDict.objectForKey("ItemCode") as? String
                //get any additional

                let ItemFavorite = ItemFavorite(item: ItemCode)
                favoriteItemsList.append(ItemFavorite)
            }
        }
    }

    return favoriteItemsList
}

這取決於您要存儲的內容以及原因。 NSUserDefaults 用於存儲用戶偏好。 您可以嘗試將其用於其他事情,但您可能不應該這樣做。

否則,如果您的需求很簡單,則 plist 文件非常簡單。 您還可以使用核心數據或提出自己的文件格式。 一般來說,我將 plist 用於簡單的任務,然后轉移到核心數據來處理更復雜的任務。

像這樣持久化數據的推薦方法是使用 Core Data。 雖然 NSUserDefaults 可用於存儲或多或少的任何內容,但它只應該用於存儲首選項。

暫無
暫無

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

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