2016-05-04 12 views
1

In meiner App führe ich einige asynchrone Aufrufe aus, die mir einige Jsons zurückgeben. Ich analysieren diese Antworten und ich bevölkern einige structs, wie folgt aus:Benutzerdefiniertes Objekt in NSUserDefault speichern

public struct StudentInfo { 

let availableExams : Int? 
let course : String? 
let courseLength : Int? 
let department : String? 
let enrolledExams : Int? 
let name : String? 
let surname : String? 
let registrationDate : String? 
let studentClass : String? 
let studentId : String? 

init?(json: JSON) { 
    self.availableExams = "availableExams" <~~ json 
    self.course = "course" <~~ json 
    self.courseLength = "courseLength" <~~ json 
    self.department = "department" <~~ json 
    self.enrolledExams = "enrolledExams" <~~ json 

    let auxName: String? = "name" <~~ json 
    self.name = auxName?.firstCharacterUpperCase() 

    let auxSurname: String? = "surname" <~~ json 
    self.surname = auxSurname?.firstCharacterUpperCase() 

    self.surname?.firstCharacterUpperCase() 
    self.registrationDate = "registrationDate" <~~ json 
    self.studentClass = "studentClass" <~~ json 
    self.studentId = "studentID" <~~ json 
} 
} 

Ich möchte die NSUserDefault verwenden, um diese Objekte zu speichern, um sie im Falle abzurufen, in denen keine Internetverbindung verfügbar ist auszuführen der API-Aufruf an den externen Web-Service. Ist dies eine praktikable Option, oder gibt es einfachere Möglichkeiten?

+2

Verwenden Sie als Erstes 'NSUserDefaults' nicht als Datenbank. Zweitens, konvertieren Sie die Daten in eine JSON-Zeichenfolge und speichern Sie diese. – dasdom

+0

schauen Sie in [NSKeyedArchiver/NSCoding] (http://shipster.com/nscoding/) – Fonix

+0

ich Daten über eine Alamofire-Anfrage als Json abrufen; dann verwende ich Gloss, um den JSON in dieses struct-Objekt zu analysieren. Kann ich 'NSUserDefault' verwenden, um die JSON-Antwort von Alamofire vor der Analyse zu speichern? –

Antwort

1

Sie können Ihre Daten analysieren und für eine effiziente Speicherverwaltung in Kerndaten und nicht in NSUserDefaults speichern. Sie können Ihre Daten aus Ihrer Datenbank (Core Data) zurückholen, ohne Probleme mit der Internetverbindung zu haben. Speichern Sie Ihre Daten als transzendieren Daten in Ihrer Datenbank.

2

Sie können diese Funktionen nutzen zu tun, was Sie wollen ...

+ (id)getUserDefaultsForKey:(NSString *)key{ 
    return [NSKeyedUnarchiver unarchiveObjectWithData:[[NSUserDefaults standardUserDefaults] objectForKey:key]]; 
} 


+ (void)setUserDefaults:(id)value forKey:(NSString *)key{ 
    [[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:value] forKey:key]; 
    [[NSUserDefaults standardUserDefaults] synchronize]; 
} 

+ (void)deleteUserDefaultsForKey:(NSString *)key{ 
    [[NSUserDefaults standardUserDefaults] removeObjectForKey:key]; 
    [[NSUserDefaults standardUserDefaults] synchronize]; 
} 

Versuchen Sie einmal ... aber Ihre benutzerdefinierten Objekt sollte wie diese Funktionen wie folgt vor.

Verwenden Sie diese 2 Funktionen im benutzerdefinierten Objekt und speichern Sie dann dieses Objekt mit den oben genannten Funktionen in Benutzerstandardeinstellungen.

+0

Wie kann ich mein Objekt anpassen, um die Funktionen 'encodeWithCoder' und 'initWithCoder' zu verwenden? Bitte, kannst du mir ein Beispiel geben? Vielen Dank! –

+0

verwenden Sie einfach diese beiden Funktionen und setzen Sie Ihre Property-Namen, wo seine geschriebene "Eigenschaft". Und das Gleiche für andere Eigenschaften. Alle Eigenschaften der Klasse. –

+0

und Sie müssen auch nscoding in der .h-Datei ableiten, als wäre Ihr benutzerdefinierter Klassenname CustomClass, dann wird es wie CustomClass: NSObject in der .h-Datei-Interface-Deklaration sein. –

2

Um ein benutzerdefiniertes Objekt auf der Festplatte zu speichern, muss dieses Objekt bestätigt werden, dass es NSCoding entspricht. Aber eine Struktur kann NSCoding nicht bestätigen. Wir können eine Klasse innerhalb der StudentInfo Struktur hinzufügen, die NSCoding entspricht:

struct StudentInfo { 
let course: String 
static func encode(student: StudentInfo) { 
let studentClassObject = HelperClass(student: student) 
NSKeyedArchiver.archiveRootObject(studentClassObject, toFile: HelperClass.path()) 
} 
static func decode() -> StudentInfo? { 
let personClassObject = NSKeyedUnarchiver.unarchiveObjectWithFile(HelperClass.path()) as? HelperClass 
return personClassObject?.student 
} 
} 

.

extension StudentInfo { 
class HelperClass: NSObject, NSCoding { 

var student: StudentInfo? 

init(student: StudentInfo) { 
    self. student = student 
    super.init() 
} 

class func path() -> String { 
    let documentsPath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).first 
    let path = documentsPath?.stringByAppendingString("/StudentInfo") 
    return path! 
} 

    guard let course = aDecoder.decodeObjectForKey("course") as? String else {  student = nil; 
super.init(); 
return nil 
} 

    student = StudentInfo(course: course) 

    super.init() 
} 

func encodeWithCoder(aCoder: NSCoder) { 
    aCoder.encodeObject(student!.course, forKey: "course") 

    } 
    } 
} 


let me = StudentInfo(course: "Swift",) 

StudentInfo.encode(me) 

let myClone = StudentInfo.decode() 

firstNameLabel.text = myClone?.course 
Verwandte Themen