基本上我已经实现了一个连接方法,它通过sendAsynchronousRequest从URL解析JSON。一切都很好。但是在sendAsynchronousRequest函数的最后,我需要重新加载一个tableView(因为数据到了,我需要显示它)。
目前我是通过将tableView作为参数发送到执行连接的类的函数来实现的
@implementation WhosWhereConnection
- (void)setUpConnection:(UITableView *)tableView {
...
[tableView reloadData];
...
}
用
调用函数[connection setUpConnection:self.tableView];
它按照我的意图工作,但我觉得这不是最优雅的做法。你会推荐什么?
希望我能接受你所有的答案,谢谢你的帮助:)。
答案 0 :(得分:3)
我建议使用块。这是方便而强大的解决方案。
这样的事情:
方法标题(.h
文件)
- (void)setupConnectionWithCompletion:(void(^)())completionBlock;
方法实施(.m
档案)
- (void)setupConnectionWithCompletion:(void(^)())completionBlock
{
// Do your stuff
// Call completion block (if set) when everything is done
if(completionBlock) {
completionBlock();
}
}
并像这样称呼它
[connection setupConnectionWithCompletion:^{
[tableView reloadData];
}];
答案 1 :(得分:1)
最好有一个在完成时调用的委托方法/块,或发布通知(如果多个实例对事件感兴趣)。这将允许您通过对WhosWhereConnection
类匿名的完成事件执行操作来打破您当前的依赖关系。最简单的更改是用块替换表视图参数。
使用委托需要最多的代码。其他答案显示其他选项的代码。
对于代表团,我们想要:
1,2& 3位于WhosWhereConnectionDelegate
级。 4是在表视图控制器上。
1
@protocol WhosWhereConnectionDelegate < NSObject >
- (void)connection:(WhosWhereConnectionDelegate *)connection didCompleteWithStatus:(BOOL)status;
@end
2
@property (weak, nonatomic) id < WhosWhereConnectionDelegate > delegate;
3
您没有显示setUpConnection
的作用,但是一旦连接完成就应该进行委托调用。
- (void)setUpConnection {
BOOL status = NO;
...
// stuff here to process things and determine the status
...
[self.delegate connection:self didCompleteWithStatus:status];
...
}
4
表视图控制器在连接开始之前将自身设置为连接的委托。
- (void)connection:(WhosWhereConnectionDelegate *)connection didCompleteWithStatus:(BOOL)status
{
[self.tableView reloadData];
}
答案 2 :(得分:1)
NSNotification
是你需要的。
- (void)setUpConnection{
//...
[[NSNotificationCenter defaultCenter] postNotificationName:@"notificationName" object:yourData];
//...
}
在你的viewController中:
- (void)viewDidLoad
{
//...
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dataDidLoad:) name:@"notificationName" object:nil];
//...
}
- (void)dataDidLoad:(NSNotification*)notification
{
//do your stuff
[tebleView reloadData];
}