在我的应用程序中,我有一个单独的对象来处理身份验证和从网络服务获取我的应用程序需要的信息以填充表格,我们称之为 Getter。
所以首先我的视图控制器分配getter
Getter *get = [[Getter alloc]init];
[get getInfoWithCompletion^(id result) {
if ([result isKindOfClass:[NSMutableArray class]]) {
NSMutableArray *array = result;
self.infoarray = array;
self.tableView.scrollEnabled = TRUE;
[self.tableView reloadData];
}
}];
当 Getter 被告知 getinfo 时,它分配一个 Downloader 对象,告诉它用一个 url 下载并给它一个完成块。当下载器完成时,它会调用一个完成块。
Getter.m
- (void)getInfoWithCompletion:(void (^)(id result))completionBlock{
self.completion = completionBlock;
Downloader *download = [[Downloader alloc]init];
[downloader downloadWithURL:@"http://....." completion:^(id results, NSError *error){
if (error) {
[self handleErrorWithError:error];
} else {
....
self.completion(theResult);
}
}];
- (void)handleErrorWithError:(NSError *)error {
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Error" message:error.localizedDescription delegate:self cancelButtonTitle:@"Skip" otherButtonTitles:@"Retry",nil];
[alert show];
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
if ([[alertView buttonTitleAtIndex:buttonIndex]isEqualToString:@"Retry"]) {
[self getInfoWithCompletion:self.completion];
} else {
self.completion(nil);
}
这里的问题是,在显示警报视图后,Getter 被释放,因此当警报尝试告诉代理点击了哪个按钮时,它会崩溃。在 ARC 之前,您可以在委托方法中的警报和 [自我释放] 之前 [自我保留]。但我不能用 ARC 做到这一点。或者,我可以调用 self.completion(error) 并让视图控制器处理它,但让 Getter 处理它更可重用,因此我不必每次使用它时都复制错误处理代码。由于我无法使用 ARC 手动保留,我如何确保 Getter 在显示警报视图后保持活动状态?