我正在做一个同步网络请求来加载我的应用程序,这不是阻止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];
}
答案 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中订阅和取消订阅相关通知。)