0

インターネットに接続している場合にのみ、一部のコードのみを実行したい:

//Reachability

[[NSNotificationCenter defaultCenter] addObserver:self
                                      selector:@selector(reachabilityChanged:)
                                      name:kReachabilityChangedNotification
                                      object:nil];

Reachability * reach = [Reachability reachabilityWithHostname:@"www.dropbox.com"];

reach.reachableBlock = ^(Reachability * reachability)
{
    dispatch_async(dispatch_get_main_queue(), ^{

        NSLog(@"Block Says Reachable");

        connect = @"yes";

    });
};

reach.unreachableBlock = ^(Reachability * reachability)
{
    dispatch_async(dispatch_get_main_queue(), ^{

        connect = @"no";


    });

};

[reach startNotifier];

//Reachability

if (connect == @"no") {

    UIAlertView *alert1 = [[UIAlertView alloc] initWithTitle:@"" message:@"There is no internet connection. Please connect to the internet. If you are already connected, there might be a problem with our server. Try again in a moment." delegate:self cancelButtonTitle:@"Dismiss" otherButtonTitles: nil];
    [alert1 show];

} else if (titleSet == NULL){

    UIAlertView *alert1 = [[UIAlertView alloc] initWithTitle:@"" message:@"Please select a group or create a new one" delegate:self cancelButtonTitle:@"Dismiss" otherButtonTitles: nil];
    [alert1 show];

}else if (NavBar.topItem.title.length < 1){

    UIAlertView *alert1 = [[UIAlertView alloc] initWithTitle:@"" message:@"Please select a group or create a new one" delegate:self cancelButtonTitle:@"Dismiss" otherButtonTitles: nil];
    [alert1 show];

} else if (newmessagename.text.length < 4){

    UIAlertView *alert1 = [[UIAlertView alloc] initWithTitle:@"" message:@"Please give a name to your event that is at least 4 characters long" delegate:self cancelButtonTitle:@"Dismiss" otherButtonTitles: nil];
    [alert1 show];

}

コードが順番に実行されていないようです。コードの実行よりもインターネット接続の確認に時間がかかっていると思います。どうすればこれを修正できますか? コードを括弧内に直接配置するように言わないでくださいconnect = @"no";

4

2 に答える 2

0

ブロックは順次実行されず、非同期で実行されます。

これは、ブロック内のコードが呼び出されるタイミングがわからないことを意味します。ブロックを使用するコードは、メソッドの残りの部分よりも前に終了して実行される場合があります (ただし、特にインターネット接続では、これはほとんどありません)。

ifs有効な時間に呼び出されるメソッドに配置する必要があります。今回はおそらくブロックからの応答を受信したとき、または私の記憶[reach startNotifier];が正しければ、到達可能性ステータスに変化があったときに通知できる場合、これがあなたのreachabilityChanged:方法のようです:

-(void) reachabilityChanged:(id) parameter
{
   //Query reachability and notify / cache as required.
} 
于 2012-11-27T17:43:29.087 に答える
0

もちろん、順番に実行されるわけではありません。これらのメソッドの要点は、到達可能性の応答を取得している間、UI のフリーズを停止することです。基本的に、到達可能性の応答を設定し、まだ何もチェックされていないときにすぐに結果を要求します。本当に必要なのは、括弧内に移動することです。

他にできることは、これらの結果で関数を作成し、両方のブロックでこの関数を呼び出すことです。

これをビューコントローラーのロード時または他の何かを表示する前に表示したい場合は、このコントローラーを表示する前に到達可能性を確認するか、「ロード」画面を追加する必要があります。

編集:私が理解していない他の何かは、これらの到達可能性メソッドは結果を取得するとブロックを起動するように見えますが、通知にも登録しています。そして、あなたがこれについて通知を投稿しているとは思いません。ここでは2つの非同期アプローチを使用しています(ブロックと通知)

于 2012-11-27T17:43:41.277 に答える