我有一個返回不同參數的JSON請求,例如name
。我想緩存名稱參數的變量,我可以在應用程序中查看它。如何在本地存儲JSON資源?
例如:來自JSON request的名稱= david。該變量被稱爲firstname
。 firstname
應該等於「大衛」。應該存儲firstname
,以便我可以在我的應用程序的所有部分查看它。
我有一個返回不同參數的JSON請求,例如name
。我想緩存名稱參數的變量,我可以在應用程序中查看它。如何在本地存儲JSON資源?
例如:來自JSON request的名稱= david。該變量被稱爲firstname
。 firstname
應該等於「大衛」。應該存儲firstname
,以便我可以在我的應用程序的所有部分查看它。
首先,您可能會考慮checking out RestKit,因爲它在iOS中成功完成了一系列服務器交互和CoreData持久性。
我的時間有點短(在午餐時間休息),所以我只是懶洋洋地從一個應用程序中發佈一個例子。
- (void)loadFiltersFromJSON {
NSString *path = [[NSBundle mainBundle] pathForResource:@"FreeFilterBank" ofType:@"json"];
NSData *filterData = [NSData dataWithContentsOfFile:path];
NSError *err;
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:filterData options:kNilOptions error:&err];
if (err) { //TODO this can be removed prior to shipping the app
NSLog(@"%@", err);
}
NSArray *definedFilters = [json objectForKey:@"Filter"];
NSManagedObjectContext* moc = [self managedObjectContext];
for (NSDictionary *filter in definedFilters) {
NSString *name = [filter valueForKey:@"name"];
BOOL exists = [self alreadyExists:name inManagedObjectContext:moc];
if (!exists) {
NSString *imageNamed = [filter valueForKey:@"imageName"];
NSString *filterDesignator = [filter valueForKey:@"filterDesignator"];
NSString *paid = [filter valueForKey:@"paidOrFree"];
[self createFilterWithName:name imageNamed:imageNamed filterDesignator:filterDesignator paidOrFree:paid];
}
}
}
- (BOOL)alreadyExists:(NSString*)filterNamed inManagedObjectContext:(NSManagedObjectContext*)moc {
NSPredicate* predicate = [NSPredicate predicateWithFormat:@"name == %@", filterNamed];
NSEntityDescription* description = [NSEntityDescription entityForName:@"Filter" inManagedObjectContext:moc];
NSFetchRequest* request = [[NSFetchRequest alloc] init];
[request setEntity:description];
[request setPredicate:predicate];
NSError* error;
NSArray* fetchedResult = [moc executeFetchRequest:request error:&error];
if (error) {
NSLog(@"%@",error.localizedDescription);
}
if (fetchedResult.count == 0) {
return NO;
}
else {
return YES;
}
}
- (void)createFilterWithName:(NSString*)name imageNamed:(NSString*)imageName filterDesignator:(NSString*)designator paidOrFree:(NSString *)paid {
NSManagedObjectContext* moc = [self managedObjectContext];
Filter* newFilter = [NSEntityDescription insertNewObjectForEntityForName:@"Filter" inManagedObjectContext:moc];
newFilter.name = name;
newFilter.imageName = imageName;
newFilter.filterDesignator = designator;
newFilter.paidOrFree = paid;
NSError* error;
[moc save:&error];
if (error) {
NSLog(@"%@",error.localizedDescription);
}
}
TL; DR從存儲束中的JSON此加載數據,檢查SQLite的數據存儲,看看我們是否已經有相同名稱的東西,並創建該對象的一個新的持久化實例,如果我們不「T。
就這個例子來說,除了這個例子之外,還有很多更多的調用來自Web上的序列化數據和iOS內部的持久數據。
無論您當前的項目是由NSUserDefaults還是CoreData提供最佳服務。我真的很建議熟悉CoreData,它在各種各樣的情況下非常有用,尤其是因爲持久數據在處理應用程序中斷和背景/前景轉換時更加強大。 –
最簡單的方法是使用NSUserDefaults並將密鑰設置爲@「firstname」,值將是@「david」。話雖如此,你可能會考慮使用更好的持久性模型,如CoreData。您也可以使用Sqlite數據庫或將鍵/值保存在plist中。有很多方法可以做到這一點。
僅供參考,請參閱本: Save string to the NSUserDefaults?
對於一些簡單的字符串,快速和骯髒的解決方案是將其存儲在NSUserDefaults
。
存儲
[[NSUserDefaults standardDefaults] setObject:firstname forKey:@"kUserFirstName"];
[[NSUserDefaults standardDefaults] synchronize];
檢索
NSString *string = [[NSUserDefaults standardDefaults] objectforKey:@"kUserFirstName"];
如果它變得複雜多了,你必須要考慮一個更有條理的持久性存儲。有效的選項是CoreData。
存在一些框架可能會幫助您在CoreData中存儲JSON資源,最有趣的是RestKit。
這是非常廣泛的,你可以使用NSUserDefaults,你可以使用CoreData,如果它只是應用程序的生命所需要的,那麼你將它作爲一個單例存儲在內存中。 – Tim
[將字符串保存到NSUserDefaults?](http://stackoverflow.com/questions/3074483/save-string-to-the-nsuserdefaults) – RyanR