-1

基本上我已经实现了一个连接方法,它通过 sendAsynchronousRequest 从 URL 解析 JSON。一切运行良好。但是在sendAsynchronousRequest函数结束时,我需要重新加载一个tableView(因为数据到了,我需要显示它)。

目前我正在通过将 tableView 作为参数发送到进行连接的类的函数来做到这一点

@implementation WhosWhereConnection

- (void)setUpConnection:(UITableView *)tableView { 
... 
[tableView reloadData];
...
}

并调用函数

[connection setUpConnection:self.tableView];

它按我的预期工作,但我觉得这不是最优雅的方式。你会推荐什么?

希望我能接受你所有的答案,谢谢你的帮助:)

4

3 回答 3

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];
}];
于 2013-07-18T08:38:46.387 回答
1

最好有一个在完成时调用的委托方法/块,或者发布通知(如果多个实例对事件感兴趣)。这将允许您通过使作为完成事件的结果执行的操作对类匿名来打破您当前拥有的依赖关系WhosWhereConnection。最简单的更改是将 table view 参数替换为块。


使用委托需要最多的代码。其他答案显示其他选项的代码。

对于委托,我们希望:

  1. 定义将被调用的方法的协议
  2. 保存委托对象引用的属性
  3. 委托的使用
  4. 委托方法的实现

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];
}
于 2013-07-18T08:35:12.177 回答
1

NSNotifications 是你需要的。

- (void)setUpConnection{
   //... 
   [[NSNotificationCenter defaultCenter] postNotificationName:@"notificationName" object:yourData];
   //...
}

在您的视图控制器中:

- (void)viewDidLoad
{
   //...
   [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dataDidLoad:) name:@"notificationName" object:nil];
   //...
}

 - (void)dataDidLoad:(NSNotification*)notification
{
   //do your stuff
   [tebleView reloadData];
}  
于 2013-07-18T08:41:58.997 回答