2013-07-18 2 views
-1

В основном я реализовал метод подключения, который анализирует JSON из URL-адреса через sendAsynchronousRequest. Все работает красиво. Но в конце функции sendAsynchronousRequest мне нужно перезагрузить tableView (поскольку данные были получены, и мне нужно их показать).Objective-C Общие переменные между классами

В настоящее время я делаю это путем отправки Tableview в качестве параметра функции класса, который делает соединительного

@implementation WhosWhereConnection 

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

и вызову функции с

[connection setUpConnection:self.tableView]; 

Это работает, как я предполагал , но я чувствую, что это не самый элегантный способ сделать это. Чтобы вы посоветовали?

Жаль, что я мог бы принять все ваши ответы, спасибо за помощь :)

ответ

1

Лучше иметь метод делегата/блок, который вызывается по завершению или опубликовать уведомление (если несколько экземпляров заинтересованы в том случае,). Это позволит вам разорвать зависимость, которую вы сейчас используете, сделав действия, выполненные в результате анонимного события завершения для класса WhosWhereConnection. Простейшим изменением будет замена параметра вида таблицы блоком.

Использование делегата требует наибольшего количества кода. Другие ответы показывают код для других параметров.

Для делегации, мы хотим:

  1. Протокола определить метод (ы), который будет называться
  2. Свойства для хранения ссылки на объект делегата
  3. Использования делегата
  4. реализации делегатского метода (-ов)

1, 2 & 3 находятся на WhosWhereConnectionDelegate cl жопа. 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]; 
} 
+0

Не могли бы вы привести пример в коде, пожалуйста? Я пытаюсь реализовать делегата уже три дня, ища вокруг, но я, похоже, не понимаю его концепции. –

+0

Вы специально хотите делегата? Ответ от @LukasKukacka показывает вариант блока, который в некотором роде проще. – Wain

+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]; 
}]; 
+0

Oookay, и как объявить - (void) setupConnectionWithCompletion: (void (^)()) completeBlock в файле .h? Я пробовал, как 4 строки, а не из них, кажется, без ошибок. –

+0

См. Отредактированный ответ. Объявление метода в файле заголовка на самом деле является первой строкой метода реализации, заканчивающейся ';' –

+0

Да, это работает хорошо. –

1

NSNotification s - это то, что вам нужно.

- (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]; 
} 
+0

Yeey, по крайней мере, теперь я знаю, как это сделать с уведомлением (мне сказали, что я тоже могу так поступить). благодаря –

Смежные вопросы