0

NSNotification とそのオブザーバーのライフサイクルに関していくつかの問題があります。

アップデート。

アプリのロジックを単純化するため、原始的に見えます。

ViewController A には「コメント」ボタンがあり、UIView B も含まれています。この UIView には、別のボタン「共有」があります。ユーザーがログインしている場合、各ボタンは本来の動作を行います。ログインしていない場合は、NSObject クラス「ロジスティック」(ほとんどのロジックがある場所) から「ログイン」メソッドを呼び出し、ポップアップ ビュー C が表示されます。そこで、ユーザーがログインした場合にボタンがリッスンするように、C で postNotificationName を作成しました。

例えばviewController Aで

- (void) comment{
    if (<user_logged_in>){
    //do the magic
                [self removeObserver];
        } else {
            [self removeObserver];
            [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(comment) name:@"dismiss_popup" object:nil];
            [Logistic login];
        }
}

「共有」メソッド(ビューBにあります)でも同じことを行いますが、たとえば「コメント」ボタンを押してからCログインポップアップをスキップし、「共有」ボタンを押してログインします- その後、「共有」と「コメント」の両方が同時にアクションを開始します。

removeObserver を呼び出す必要があると思います

    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"dismiss_popup" object:nil];

しかし、まだ存在している間に UIView B でそれを行う方法は?

よろしく。

4

3 に答える 3

1

Logisticsでログイン方法を次のように変更できます。

関数プロトタイプ:

+ (void)loginComplete:(void(^)(BOOL success))complete;

関数自体:

+ (void)loginComplete:(void(^)(BOOL success))complete {
//login code
BOOL success = YES;//or no if it was some problems))
complete(success);//replace notification post with this
}

そして最後にviewController Aで:

- (void) comment{
if (<user_logged_in>){
//do the magic
            [self removeObserver];
    } else {
        [self removeObserver];
        //we don't need Notification center anymore
        [Logistic loginСomplete:^(BOOL success) {
            handle login completion
        }];
    }

}

于 2013-09-06T16:47:28.750 に答える
0
- (IBAction)commentButton:(id)sender {
    if (!user logged in) {
        [self.logistic loginUserWithCompletion:^(id result){
            if (![result isKindOfClass:[NSError class]]) {
                [self doStuff];
            }
        }];
    } else {
        [self doStuff];
    }
于 2013-09-06T17:46:18.217 に答える