Преобразовать сетевой запрос из синхронного в асинхронный - PullRequest
0 голосов
/ 19 ноября 2011

В настоящее время я выполняю синхронный сетевой запрос на загрузку моего приложения, что является не лучшим способом, поскольку он блокирует пользовательский интерфейс.Я также использую ASIHTTPRequest.Я понимаю, что могу просто изменить строку с синхронной на асинхронную, но я думаю, что мне нужно настроить блок так, чтобы я мог инициировать перезагрузку таблицы после завершения асинхронности.

Первоначальный ViewController моего приложения:

- (void)fetchAppointmentsForVisibleDate {
    self.appointmentArray = [DrChronoDataSource getTodayData:self.visibleDate];

    NSMutableArray *array = [NSMutableArray arrayWithCapacity:50];
    for (NSDictionary *appointment in self.appointmentArray)
    {
        [array addObject: [NSString stringWithFormat:@"%@: %@", [appointment objectForKey:@"scheduled_time"], [appointment objectForKey:@"patient"]]];
    }
    self.listData = array;
    [self.appointmentTableView reloadData];
}

В классе источника данных моего приложения:

+ (NSMutableArray*)getTodayData:(NSDate*)today
{
        NSURL *url = myURL here 
        ASIFormDataRequest *request = [[ASIFormDataRequest alloc] initWithURL:url];
        [request setPostValue:[dateFormat stringFromDate:today] forKey:@"target_date"];

        [request startSynchronous];

        NSError *error = [request error];
        NSString *responseString;
        if (!error) {
            responseString = [request responseString];
        } else {
            return NULL;
        }
        return [responseString JSONValue];
}

Ответы [ 2 ]

0 голосов
/ 19 ноября 2011

Шаблон, который, как я обнаружил, хорошо работает, заключается в том, чтобы одноэлементный объект бэкэнда анализировал ответ, сохранял его и отправлял NSNotification. Таким образом, соответствующие контроллеры представления могут проверять обновление своего контента, только если они находятся на экране. (Обязательно подпишитесь и отмените подписку на соответствующее уведомление из viewWillAppear и viewWillDisappear, хотя).

0 голосов
/ 19 ноября 2011
+ (void) getTodayData:(NSDate*)today callback:(void (^) (NSError * error, NSMutableArray * array)) callback
{
        NSURL *url = myURL here 
        ASIFormDataRequest *request = [[ASIFormDataRequest alloc] initWithURL:url];
        [request setPostValue:[dateFormat stringFromDate:today] forKey:@"target_date"];
        [request setCompletionBlock:^{
            callback(nil, [responseString JSONValue]);
        }];
        [request setFailBlock:^{
           callback([request error], nil);
        ];
        [request startAsynchronous];
}

- (void)fetchAppointmentsForVisibleDate {
    [DrChronoDataSource getTodayData:self.visibleDate callback:^(NSError *error, NSMutableArray *data))callback {
        if (!error) {
            self.appointmentArray = [data retain];
            NSMutableArray *array = [NSMutableArray arrayWithCapacity:50];
            for (NSDictionary *appointment in self.appointmentArray)
            {
                [array addObject: [NSString stringWithFormat:@"%@: %@", [appointment objectForKey:@"scheduled_time"], [appointment objectForKey:@"patient"]]];
            }
            self.listData = array;
            [self.appointmentTableView reloadData];
        }
        else 
            NSLog(@"%@", error.description);
    }];
}  

Вам нужно изменить метод, чтобы вы были уведомлены о завершении загрузки, используя блок. Блоки ASI Completion & Failure должны быть установлены. Пожалуйста, переименуйте их, так как я не проверил код, и я уверен, что я написал неправильные методы.

...