iOS เทียบเท่าสำหรับ Android Shared Preferences


107

ฉันกำลังย้ายแอป Android ไปยัง iOS สิ่งหนึ่งที่ฉันใช้คือ Shared Preferences ใน Android เพื่อประหยัดทุกครั้งที่ระดับเสร็จสมบูรณ์

ด้วยวิธีนี้เมื่อผู้ใช้กลับเข้าสู่แอปพวกเขาจะเห็นว่าพวกเขาอยู่ในระดับ 3 หรืออะไรก็ตาม

มีกลไกคล้ายกันใน iOS หรือไม่? หรือฉันต้องเขียนลงในไฟล์เฉพาะแอปพลิเคชันด้วยตนเอง?

ถ้าเป็นเช่นนั้นฉันจะเขียนลงในไฟล์ที่ปรากฏเฉพาะกับแอปพลิเคชันของฉันได้อย่างไร

ขอบคุณ.


1
ผมคิดว่าสิ่งที่ใกล้จะถึงนี้ใน iOS เป็นNSUserDefaults และนี่คือตัวอย่างง่ายๆในการบันทึกและดึงข้อมูล
Tarek Hallak

คำตอบ:


204

ใช้NSUserDefaults : - โปรดทราบว่านี่มีไว้สำหรับข้อมูลขนาดเล็กเช่นระดับปัจจุบันเช่นที่คุณกล่าวถึง อย่าใช้สิ่งนี้ในทางที่ผิดและใช้เป็นฐานข้อมูลขนาดใหญ่เพราะจะโหลดลงในหน่วยความจำทุกครั้งที่คุณเปิดแอปไม่ว่าคุณจะต้องการอะไรจากแอปหรือไม่ก็ตาม (ส่วนอื่น ๆ ของแอปของคุณก็จะใช้สิ่งนี้เช่นกัน)

วัตถุประสงค์ -C:

การอ่าน:

NSUserDefaults *preferences = [NSUserDefaults standardUserDefaults];

NSString *currentLevelKey = @"currentlevel";

if ([preferences objectForKey:currentLevelKey] == nil)
{
    //  Doesn't exist.
}
else
{
    //  Get current level
    const NSInteger currentLevel = [preferences integerForKey:currentLevelKey];
}

การเขียน:

NSUserDefaults *preferences = [NSUserDefaults standardUserDefaults];

NSString *currentLevelKey = @"currentlevel";

const NSInteger currentLevel = ...;
[preferences setInteger:currentLevel forKey:currentLevelKey];

//  Save to disk
const BOOL didSave = [preferences synchronize];

if (!didSave)
{
    //  Couldn't save (I've never seen this happen in real world testing)
}

.

รวดเร็ว:

การอ่าน:

let preferences = NSUserDefaults.standardUserDefaults()

let currentLevelKey = "currentLevel"

if preferences.objectForKey(currentLevelKey) == nil {
    //  Doesn't exist
} else {
    let currentLevel = preferences.integerForKey(currentLevelKey)
}

การเขียน:

let preferences = NSUserDefaults.standardUserDefaults()

let currentLevelKey = "currentLevel"

let currentLevel = ...
preferences.setInteger(currentLevel, forKey: currentLevelKey)

//  Save to disk
let didSave = preferences.synchronize()

if !didSave {
    //  Couldn't save (I've never seen this happen in real world testing)
}

นอกจากนี้คุณยังสามารถใช้เงื่อนไขผูกพันสำหรับการอ่านในที่รวดเร็วif let savedLevel = preferences.integerForKey(currentLevelKey) { currentLevel = savedLevel}
รัค Teja

4
@chitti ไม่ได้ผล integerForKey ไม่ส่งคืนตัวเลือก
SomeGuy

41

นี่คือการอัปเดตสำหรับ Swift 3

การอ่าน

let preferences = UserDefaults.standard

let currentLevelKey = "currentLevel"
if preferences.object(forKey: currentLevelKey) == nil {
    //  Doesn't exist
} else {
    let currentLevel = preferences.integer(forKey: currentLevelKey)
}

การเขียน

let preferences = UserDefaults.standard

let currentLevel = ...
let currentLevelKey = "currentLevel"
preferences.set(currentLevel, forKey: currentLevelKey)

อัปเดต

จากเอกสารคู่มือ UserDefaults

synchronize()รอการอัปเดตแบบอะซิงโครนัสที่รอดำเนินการสำหรับฐานข้อมูลเริ่มต้นและส่งคืน ตอนนี้วิธีนี้ไม่จำเป็นและไม่ควรใช้


2
class Configuration {

    static func value<T>(defaultValue: T, forKey key: String) -> T{

        let preferences = UserDefaults.standard
        return preferences.object(forKey: key) == nil ? defaultValue : preferences.object(forKey: key) as! T
    }

    static func value(value: Any, forKey key: String){

        UserDefaults.standard.set(value, forKey: key)
    }

}

ตัวอย่าง

//set
Configuration.value(value: "my_value", forKey: "key_1")

//get
let myValue = Configuration.value(defaultValue: "default_value", forKey: "key_1")

-1

ตามคำตอบก่อนหน้านี้คุณทราบแล้วว่าUserDefaultsเทียบเท่ากับค่ากำหนดที่แชร์ใน ios คุณสามารถสร้างฟังก์ชันการเขียนทั่วไปและสำหรับฟังก์ชันสร้างการอ่านตามชนิดข้อมูล และเรียกวิธีการที่คุณต้องการได้จากทุกที่

ViewController.swift

 // write data
 writeAnyData(key: "MY_KEY", value: "MyData")
 // read string data 
 readStringData(key: "MY_KEY"), animated: true)

Utils.swift

// read and write user default
let userDefault = UserDefaults.standard
// write
func writeAnyData(key: String, value: Any){
    userDefault.set(value, forKey: key)
    userDefault.synchronize()
}

// read int values
func readIntData(key: String) -> Int{
    if userDefault.object(forKey: key) == nil {
        return 0
    } else {
        return userDefault.integer(forKey: key)
    }
}

// read string values
func readStringData(key: String) -> String{
    if userDefault.object(forKey: key) == nil {
        return ""
    } else {
        return userDefault.string(forKey: key)!
    }
}
// read bool value
func readBoolData(key: String) -> Bool{
    if userDefault.object(forKey: key) == nil {
        return false
    } else {
        return userDefault.bool(forKey: key)
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.