2016-05-04 5 views
1

私のアプリでは、いくつかのjsonsを返す非同期呼び出しをいくつか実行します。私はこれらの応答を解析し、私は次のようないくつかの構造体を、移入:NSUserDefaultにカスタムオブジェクトを保存します

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 
} 
} 

私はこれらのオブジェクトを格納するためにNSUserDefaultを使用したい、何のインターネット接続が実行するのに利用できない場合には、それらを取得するために、外部WebサービスへのAPI呼び出し。これは実行可能な選択肢ですか、それとも簡単な方法ですか?

+2

まず、NSUserDefaultsをデータベースとして使用しないでください。次に、データをJSON文字列に変換して保存します。 – dasdom

+0

[NSKeyedArchiver/NSCoding](http://nshipster.com/nscoding/)を調べてください – Fonix

+0

私はAlamofireリクエストでデータを取得します。次に、この構造体オブジェクトにjsonを解析するためにGlossを使用します。 NSUserDefaultを使用してAlamofireのjsonレスポンスを保存して解析することはできますか? –

答えて

1

効率的なメモリ管理のために、データを解析してNSUserDefaultsではなくコアデータに格納することができます。インターネット接続の問題なくデータベース(Core Data)からデータを取得できます。データを超越データとしてデータベースに格納します。

2

あなたがやりたいこれらの機能を使用することができます...

+ (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]; 
} 

は一度試してみてください...しかし、カスタムオブジェクトには、以下のものを関数のように従うべきです。

これらの2つの関数をカスタムオブジェクトで使用し、上記の関数を使用してユーザーのデフォルトで保存します。

+0

'encodeWithCoder'関数と' initWithCoder'関数を使用するためにオブジェクトをどのように適合させることができますか?あなたは私に例を挙げてくれますか?ありがとう! –

+0

これらの2つの関数を使用して、プロパティ名を「プロパティ」に書いてください。他のプロパティでも同様です。クラスのすべてのプロパティ。 –

+0

また、.hファイルでnscodingをサブクラス化する必要があります。カスタムクラス名がCustomClassの場合、CustomClassのようになります。NSObject .hファイルのインターフェイス宣言にあります。 –

2

カスタムオブジェクトをディスクに保存するには、そのオブジェクトをNSCodingに準拠していることを確認する必要があります。しかし、構造体はNSCodingに確認できません。 我々はNSCodingに準拠StudentInfo構造体の中にクラスを追加することができます。

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 
関連する問題