У меня есть приложение, которое извлекает 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, то я задам отдельный вопрос.
Я был бы признателен за вашу помощь.