UIViewController и асинхронные вызовы - PullRequest
0 голосов
/ 26 ноября 2010

У меня есть класс контроллера, который использует асинхронные вызовы для выполнения некоторых сетевых операций. Моя иерархия представления основана на навигации, например View1 > View2 > View3.

Теперь давайте предположим, что мой View3 (View3Controller) использует асинхронные вызовы для выполнения некоторых сетевых операций, а View2Controller также реализует некоторые методы делегата.

Пользователь может использовать кнопку «Назад» для перехода назад в любое время, и, следовательно, [View3Controller dealloc] вызывается. Теперь я хочу завершить асинхронную операцию! Есть ли (безопасный) способ убедиться, что View3Controller не получает dealloc 'ed до завершения асинхронной операции?

Ответы [ 2 ]

0 голосов
/ 26 ноября 2010

Одним из решений является перемещение асинхронного вызова в его собственный класс, предпочтительно принадлежащий View2Controller или кому-то более высокому. При нажатии View3Controller вы просто передаете этот новый класс, и если пользователь переместится назад, он продолжится так, как вы хотите.

Представьте себе объект, подобный:

AsyncObject : NSObject {}
@property (nonatomic, assign) id delegate;
- (void)start;

и при нажатии View3Controller

View3Controller *view3Controller = ...
view3Controller.asyncObject = self.asyncObject;
[self.navigationController pushView....];

и при запуске асинхронной операции из View3Controller

self.asyncObject.delegate = self;
[self.asyncObject start]; 

если пользователь переместится назад, вы потенциально можете сделать что-то подобное в navigationController:willShowViewController:animated: в View2Controller и получить обратные вызовы от asyncObject на случай, если View3Controller будет получен.

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
  if (viewController == self) {
    self.asyncObject.delegate = self;
  }
}

Если вам нужно иметь возможность получать события от asyncObject для нескольких объектов одновременно, вы должны смотреть на уведомления или KVO (Key Value Observing) вместо использования делегата.

0 голосов
/ 26 ноября 2010

Когда вы помещаете View3Controller в стек, я предполагаю, что вы создаете его экземпляр, помещаете его в стек и затем выпускаете его следующим образом:

-(void)someMethod {
   View3Controller *vc = [[View3Controller alloc] init];
   [self.navigationController pushViewController:vc animated:YES];
   [vc release];
}

Вы можете просто опустить сообщение [vc release], пока не будет вызван ваш -(void)connectionDidFinishLoading:(NSURLConnection *)connection, тогда вы знаете, что готовы его отпустить?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...