将网络请求从同步转换为异步

时间:2011-11-19 00:21:19

标签: iphone objective-c cocoa-touch networking asihttprequest

我正在做一个同步网络请求来加载我的应用程序,这不是阻止UI的最佳方式。我也在使用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];
}

在我的应用程序的dataSource类中:

+ (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 :(得分:0)

+ (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完成&需要设置故障块。请重命名它们,因为我没有检查代码,我确信我拼错了这些方法。

答案 1 :(得分:0)

我发现效果很好的模式是让后端单例对象解析响应,保存并发送NSNotification。这样,相关视图控制器只有在屏幕上时才能检查更新其内容。 (请务必在viewWillAppear和viewWillDisappear中订阅和取消订阅相关通知。)