Objective-C类之间的共享变量

时间:2013-07-18 08:28:53

标签: objective-c class variables

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

目前我是通过将tableView作为参数发送到执行连接的类的函数来实现的

@implementation WhosWhereConnection

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

调用函数
[connection setUpConnection:self.tableView];

它按照我的意图工作,但我觉得这不是最优雅的做法。你会推荐什么?

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

3 个答案:

答案 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. 委托的用法
  4. 委托方法的实施
  5. 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];
}