0

nameたとえば、さまざまなパラメーターを返す JSON 要求があります。後でアプリで表示できる name パラメーターの変数をキャッシュしたいと思います。

例: JSON リクエストからの名前 = david. 変数は と呼ばれfirstnameます。firstname「デビッド」と等しい必要があります。firstnameアプリのすべての部分で表示できるように保存する必要があります。

4

3 に答える 3

1

まず、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 データ ストアをチェックして、同じ名前のものが既にあるかどうかを確認し、存在しない場合は、このオブジェクトの新しい永続的なインスタンスを作成します。

この例を参考にしてください。Web からプルされたシリアル化されたデータと iOS 内の永続データの呼び出しは、この 1 つの例以外にもたくさんあります。

于 2013-10-24T20:15:32.130 に答える