次のコードがあります:
@implementation SplashViewVC
- (void)viewDidLoad
{
[super viewDidLoad];
self.splashView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"Default.png"]];
self.activityIndicator.originY = 355.f;
[[NSNotificationCenter defaultCenter] addObserverForName:NCDownloadComplete object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *n){
NSInteger errorCode = [n.userInfo[@"errorCode"] integerValue];
[self.activityIndicator stopAnimating];
if (errorCode == ERROR_CODE_NO_CONNECTION) {
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Some problem with server" delegate:self cancelButtonTitle:@"try again" otherButtonTitles:nil];
[alertView show];
} else if (errorCode == 0) {
[self dismissViewControllerAnimated:YES completion:nil];
}
}];
[self downloadData];
}
- (void)downloadData
{
[self.activityIndicator startAnimating];
[[Server sharedServer] getMovieData];
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
[self downloadData];
}
- (void)viewDidDisappear:(BOOL)animated
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
[super viewDidDisappear:animated];
}
@end
viewDidLoad
そこで、メソッドの先頭にブレークポイントを配置しましたviewDidDisappear
。最初に に移動するアプリを起動するとviewDidload
、ダウンロード後に に移動しviewDidDisappear
ます。
しかし、私のアプリでは、データを再度ダウンロードして投稿しnotification: NSDownloadComplete
ます。そして、この VC では動作しますが、後で以下を使用して削除しました:
[[NSNotificationCenter defaultCenter] removeObserver:self]
この VCviewDidLoad
は最初に 1 回使用され、再度 addObserver を使用することはできません。
なにが問題ですか?
編集
addObserver メソッドをviewWillAppear
またはに配置しようとしましたviewWillDisappear
-結果はありません。NSLog(@"addObserver");
前に追加します
[[NSNotificationCenter defaultCenter] addObserverForName...
ビューでDidLoad
そして書く
- (void)viewDidDisappear:(BOOL)animated
{
NSLog(@"removeObserver");
[[NSNotificationCenter defaultCenter] removeObserver:self];
[super viewDidDisappear:animated];
}
ログに次のように表示されます。
2013-06-10 14:32:05.646 myApp[9390:c07] addObserver
2013-06-10 14:32:06.780 myApp[9390:c07] removeObserver
どうしたの?
EDIT 2 オブザーバーを削除する必要があることがわかりますが、 addObserver メソッドで再びブロックを実行します