TableView не отвечает во время WebRequest (AFNetworking) на устройстве, но нормально в симуляторе + проблема с MagicalRecord

У меня есть приложение, которое извлекает json (графики работы сотрудников) из веб-службы с помощью AFNetworking и отображает их в виде таблицы.

У меня есть свой класс веб-сервиса, который заботится о выполнении запроса, и как только он будет выполнен, он сохраняет эти данные в основных данных (у меня есть еще одна проблема, заключающаяся в том, что я использую magicRecord, и данные не сохраняются, и я не понимаю почему), а затем вызывает своего делегата (мой 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]; 
}

Моя проблема в том, что когда я запускаю это во время обработки запроса, пользовательский интерфейс не отвечает (это очень короткое время, но если запрос будет увеличиваться...), так что, если я загружу табличное представление и сразу попытаюсь прокрутить или нажмите кнопку «Назад», он просто игнорирует ее, поскольку она «заморожена». Такое поведение на моем iphone 4s. На симуляторе это работает нормально, и я не могу понять, почему это так. Я попытался вызвать "[self.webServiceClient getMockedWorkSchedulesForEmployee: [NSNumber numberWithInt: 1]];" в очереди с помощью GCD я пробовал с помощью PerformSelectorInBackground: WithObject: etc, но все равно (хотя с этим последним методом он показался немного более эффективным, но это впечатление и только на симуляторе, никаких изменений на устройстве).

Что касается magicRecord, то я задам отдельный вопрос.

Я был бы признателен за вашу помощь.


person Manuel Maestrini    schedule 09.12.2012    source источник


Ответы (1)


Починил это. Проблема в том, что блок успеха выполняется в основном потоке! (чего я не понял). Я просто использовал GCD в блоке успеха с фоновой очередью для обработки данных и основной очередью для хранения этих данных в основных данных.

Что касается проблемы с магической записью, мне нужно было сохранить «nestedContext».

Всем привет.

person Manuel Maestrini    schedule 10.12.2012
comment
Это объясняет, почему в симуляторе все было в порядке: ваш компьютер намного быстрее, чем ваше устройство iOS! - person Zev Eisenberg; 10.12.2012
comment
да, я добавил дополнительный бесполезный код, чтобы заставить его ждать дольше и убедиться, что он будет делать то же самое в симуляторе. (до того, как я нашел проблему). - person Manuel Maestrini; 11.12.2012
comment
Привет, у меня такая же проблема, не могли бы вы поделиться, как вы решили эту проблему? Я ценю, спасибо заранее. - person Malloc; 29.03.2013