Одним из решений является перемещение асинхронного вызова в его собственный класс, предпочтительно принадлежащий 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) вместо использования делегата.