在设备上使用WebRequest(AFNetworking)时无响应的TableView,但在模拟器+ MagicalRecord问题中没问题

时间:2012-12-09 03:17:04

标签: ios core-data magicalrecord

我有一个应用程序,它使用AFNetworking从Web服务检索json(雇员工作计划),并在表格视图中显示它们。

我的webservice类负责处理请求,一旦完成,它会将这些数据存储到coredata中(我在这里有另一个问题,因为我使用了magicalRecord并且数据不会持续存在,而且我不知道#39;理解为什么)然后回调它的委托(我的tableViewController)告诉它已经完成,所以这可以将工作计划加载到单元格中。

WebServiceClient.m

NSURL *url = [NSURL URLWithString:stringUrl];
NSURLRequest *request = [NSURLRequest requestWithURL:url];

AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request 
    success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) 
    {
        NSArray *workSchedules = [[[NSSet alloc] initWithArray:JSON] allObjects];
        NSManagedObjectContext *context = [NSManagedObjectContext MR_contextForCurrentThread];
        Workschedule *workscheduleEntity = nil;
        NSError *error = nil;
        for (NSDictionary *web_workschedule in workSchedules) 
        {//Inside this method I create other entities that will hydrate my workschedule entity, and it is done using the MR_CreateInContext
          workscheduleEntity = [Workschedule workScheduleFromJSONDictionary:web_workschedule  withError:&error];
          [context MR_save];
        }
        if([self.delegate respondsToSelector:@selector(workSchedules)]){
           [self.delegate workSchedules];
        }
    } 
    failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
        LOG_ERROR(2,@"Received an HTTTP %d:", response.statusCode);
        LOG_ERROR(2,@"The error was: %@", error);
        if([self.delegate respondsToSelector:@selector(workSchedules:)]){
        [self.delegate workSchedules:nil];//return error
    }}];
NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init];
[operationQueue addOperation:operation]; 
}

PendingWorkscheduleViewController.m

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self.webServiceClient getMockedWorkSchedulesForEmployee:[NSNumber numberWithInt:1]];
    [self workSchedules];
}

-(void)workSchedules
{
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"pending == YES"];
    NSArray *pendingWorkSchedules = [Workschedule MR_findAllWithPredicate:predicate];
    self.pendingWorkSchedules = pendingWorkSchedules;
    [self.tableView reloadData]; 
}

我的问题是,当我在处理请求时运行它时,UI没有响应(它是一个非常短暂的时间,但如果请求增加...),所以如果我加载表视图和立即尝试滚动或单击后退按钮,它只是忽略它,因为它是"冻结"。这个行为是在我的iPhone 4s上。在模拟器上,工作很好,我无法理解为什么会这样。我试着调用" [self.webServiceClient getMockedWorkSchedulesForEmployee:[NSNumber numberWithInt:1]];"在使用GCD的队列中,我尝试使用performSelectorInBackground:WithObject:etc但仍然相同(即使使用这最后一种方法它看起来效率更高一点,但它只是在模拟器上的印象,没有变化装置)。

就魔法记录而言,我将提出单独的问题。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

修正了它。问题是成功块在主线程上运行! (我不明白)。我只是在成功块中使用GCD,后台队列用于处理数据,主队列用于将此数据存储在核心数据中。

就魔法记录问题而言,我需要保存“nestedContext”。

为每个人欢呼。