0

インターネット接続をテストReachabilitydispatch_async(dispatch_get_main_queue() 、次のコードをテストすると動作しますが、複数回呼び出されます。

親:

@protocol RootViewDelegate <NSObject>
@optional
-(void)internetIsDownGoToRoot;
@end
- (void)testInternetConnection
{
    internetReachableFoo = [ReachabilityTony reachabilityWithHostname:@"www.google.com"];

    __weak typeof(self) weakSelf = self;
    // Internet is reachable
    internetReachableFoo.reachableBlock = ^(ReachabilityTony *reach)
    {
        // Update the UI on the main thread
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"Yayyy, we have the interwebs!");
            [weakSelf sendLoginRequest];
        });
    };
        // Internet is not reachable
internetReachableFoo.unreachableBlock = ^(ReachabilityTony *reach)
{
    // Update the UI on the main thread
    dispatch_async(dispatch_get_main_queue(), ^{
        NSLog(@"Someone broke the internet :(");
        CloudConnection *sharedInstance=[CloudConnection  sharedInstance];
        sharedInstance.isUserLoggedIN=NO;
        //update login button
        [weakSelf updateButtons];
        [weakSelf notifyChild];

    });
};
    [internetReachableFoo startNotifier];
}
-(void)viewDidAppear:(BOOL)animated
{
[self testInternetConnection];
 }
-(void)viewWillDisappear:(BOOL)animated
{
    internetReachableFoo= nil;

}
//notify childs no connection come back to root
-(void) notifyChild
{
    [delegate internetIsDownGoToRoot];

}

子:

-(void)viewDidAppear:(BOOL)animated
{

    NSArray *viewControllers =     self.navigationController.viewControllers;
    int count = [viewControllers count];
    id previousController = [viewControllers objectAtIndex:count - 2];
    RootViewController *rvc= previousController;
    rvc.delegate=self;


}

-(void)internetIsDownGoToRoot
{
    //internet connection is no avaliable go to root
    [self.navigationController popToRootViewControllerAnimated:YES];

}

つまり、これはparentviewです。childviewを5回押してインターネットをシャットダウンするとしましょう。私はnslogでそれを見ます

Someone broke the internet :(
Someone broke the internet :(
Someone broke the internet :(
Someone broke the internet :(
Someone broke the internet :(

ご覧のとおり、追加しましinternetReachableFoo= nil;たが、何も変更していません。

上記のコードで何が起こっているのですか?なぜ複数回呼び出されるのですか?

このブロックを使用すると、どのような危険が生じる可能性がありますか?

4

1 に答える 1

4

子をポップするたびに、ルートがを取得-viewDidAppear:して呼び出し-testInternetConnection、到達可能性テストを再実行するため、複数回呼び出されます。

更新:質問を少し変更しました。「消えました」というメッセージが 5 つ表示されるのは、ノーティファイアを停止していないためです。到達可能性は実行されている限りそれ自体を維持するため、参照を無効にしてもそれは無効になりません。削除する前に明示的に言う必要があります[internetReachableFoo stopNotifier]

于 2013-04-01T19:14:35.170 に答える