使用魔法记录在块内保存数据

时间:2014-09-30 14:29:12

标签: core-data magicalrecord-2.2

我正在从API资源中检索一些数据,并且我想使用Magical Record将结果存储在City实体中,当过程完成时,在我的ViewController中重新加载一个带有结果的tableView。

一切都很好但是当我第一次启动应用程序时,会启动下载过程并将数据保存在核心数据中。 enter image description here

但我的ViewControllers中的表视图为空。

如果我是第一次启动应用程序 enter image description here

tableView正确刷新。

我不知道问题是否在线程中......有人可以帮助我吗?

ViewController

我在这里开始请求。当调用块时,我存储cities数组并重新加载tableView

- (void)getCitiesFromDataStore {
    [[APIManager sharedManager] getCitiesWithCompletion:^(NSArray *cities) {
        _dataSourceArray = cities;

        [self.citiesTableView reloadData];
    } failure:^(NSError *error) {
        NSLog(@"%@",error.localizedDescription);
    }];
}

APIMAnager

- (void)getCitiesWithCompletion:(void (^)(NSArray *))succesBlock
                        failure:(void (^)(NSError *))errorBlock
{


    NSArray *cachedCities = [City findAllCities];

    if ([cachedCities count] == 0) {
        [self GET:@"cities" parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) {

            NSArray *results = responseObject[@"cities"];

            [City MR_importFromArray:results];

            [[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait];

            NSArray *cities = [City findAllCities];

            succesBlock(cities);

        } failure:^(NSURLSessionDataTask *task, NSError *error) {
            errorBlock(error);
        }];

        return;
    }

    // Si ya hay ciudades almacenadas en CoreData, devuelvo el
    // succesblock con las ciudades de CoreData
    succesBlock(cachedCities);


}

我还有一个类别来管理城市实体的行动

市+ DBOperations

+ (NSArray *)findAllCities
{
    NSArray *cities = [City MR_findAll];

    return cities;
}

1 个答案:

答案 0 :(得分:0)

我知道你说你已经解决了,但是对于其他可能来这里的人你可以尝试另外一件事就是将导入包装在saveWithBlock:completion:中并在完成块中找到你的发现。

还要确保您知道每个方法使用的上下文。明确这一点通常很有帮助。

因此您可以将其更改为(这是未经测试的,但应该为您提供概念):

[self GET:@"cities" parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) {

    NSArray *results = responseObject[@"cities"];

    [MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
        [City MR_importFromArray:results inContext:localContext];
    } completion:^(BOOL contextDidSave, NSError *error) {
        NSArray *cities = [User MR_findAllInContext:[NSManagedObjectContext MR_defaultContext]];
        succesBlock(cities);
    }];

} failure:^(NSURLSessionDataTask *task, NSError *error) {
    errorBlock(error);
}];