【问题标题】:How do I store a JSON resource locally?如何在本地存储 JSON 资源?
【发布时间】:2013-11-03 16:25:54
【问题描述】:

我有一个 JSON 请求,它返回不同的参数,例如 name。我想为 name 参数缓存一个变量,稍后我可以在应用程序中查看。

例如:来自 JSON 请求的名称 = david。该变量称为firstnamefirstname 应该等于“大卫”。 firstname 应该被存储,以便我可以在我的应用程序的所有部分中查看它。

【问题讨论】:

  • 这很宽泛,你可以使用 NSUserDefaults,你可以使用 CoreData,如果它只在应用程序的生命周期中需要,你可以将它作为单例存储在内存中。

标签: ios json caching


【解决方案1】:

对于像字符串这样简单的东西,快速而肮脏的解决方案是将其存储在NSUserDefaults

存储

[[NSUserDefaults standardDefaults] setObject:firstname forKey:@"kUserFirstName"];
[[NSUserDefaults standardDefaults] synchronize];

检索

NSString *string = [[NSUserDefaults standardDefaults] objectforKey:@"kUserFirstName"];

如果它变得比这更复杂,您必须考虑一个更结构化的持久性存储。一个有效的选项是CoreData

有一些框架可以帮助您在 CoreData 中存储 JSON 资源,最有趣的是 RestKit

【讨论】:

    【解决方案2】:

    首先,您可以考虑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 数据存储以查看我们是否已经有同名的东西,如果没有,则创建该对象的新持久实例。

    随便看看这个例子吧,除了这个例子之外,还有更多调用从网络中提取的序列化数据和 iOS 中的持久数据。

    【讨论】:

    • 不管你当前的项目是由 NSUserDefaults 还是 CoreData 提供最好的服务。我真的非常建议您熟悉 CoreData,它在非常广泛的情况下都非常有用,尤其是因为持久数据在处理应用程序中断和后台/前台转换方面更加强大。
    【解决方案3】:

    最简单的方法是使用 NSUserDefaults 并将键设置为 @"firstname",值将是 @"david"。话虽如此,您可能会考虑使用更好的持久性模型,例如 CoreData。您还可以使用 Sqlite 数据库或将键/值保存在 plist 中。有很多方法可以做到这一点。

    供参考,请参阅: Save string to the NSUserDefaults?

    【讨论】:

      猜你喜欢
      • 2013-11-30
      • 1970-01-01
      • 2019-03-03
      • 2021-12-14
      • 1970-01-01
      • 2012-02-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多