2

接続が失敗したときのアプリの動作をテストしようとしています。Wi-FiをオフにしたiPadでテストしています。Restkit が Web サービスの呼び出しを試みると、次のエラーが発生します。

CPL[7713:6203] E restkit.network:RKRequest.m:545 Failed to send request to https://xxxxxxxx/APNS_WebService/rest/operations/initializeDevice?deviceID=c4a17f855d3cc824b174b71908480d4e505ebfb221cb4643da9270a07344c367 due to unreachable network.

問題は、デリゲート コールバック メソッドでこの状況を処理したいのですが、どのデリゲート メソッドも呼び出されていないことです。リクエストにデリゲートを設定し、requestDidFailLoadWithError、requestDidCancelLoad、requestDidTimeout、および objectLoaderDidFailWithError を実装しました。これらのどれも呼び出されません。

代理人が呼び出されないのはなぜですか?

編集: RKRequest.m 内にブレークポイントを設定した後、次の行が実際に実行されていることがわかります。

        [self performSelector:@selector(didFailLoadWithError:) withObject:error afterDelay:0];

ただし、デリゲート メソッドが呼び出されません。

デリゲートを設定する場所は次のとおりです。

request = [client requestWithResourcePath:[NSString stringWithFormat:@"/initializeDevice?deviceID=%@",deviceID]];
request.delegate=self;
[request sendAsynchronously];

編集 2:実際、上に投稿した RKRequest.m の行は、そうでないことを除いて、RKRequest の別のメソッドを呼び出しているだけです。didFailLoadWithError にブレークポイントを設定すると、このコードに到達しないことがわかります。なぜそれが機能しないのかわかりません。

performSelector を通常のメソッド呼び出しに変更すると、探している動作が表面に表示されます。これで何か壊れますか?同じクラスのメソッドを呼び出すために performSelector が使用されている理由がわかりません。

編集3:要求に応じて、ここに私のデリゲートメソッドがあります:

-(void)request:(RKRequest *)request didFailLoadWithError:(NSError *)error{
    NSLog(error.domain);
    NSLog([NSString stringWithFormat:@"%d",error.code]);
    NSLog(error.localizedDescription);
    NSLog(error.localizedFailureReason);

    [request reset];
    [request send];
}
4

1 に答える 1

1

編集:

実際、上記で投稿したRKRequest.mの行は、そうでないことを除いて、RKRequestの別のメソッドを呼び出しているだけです。didFailLoadWithErrorにブレークポイントを設定すると、このコードに到達することはありません。なぜそれが機能しないのかわかりません。

これは本当に奇妙です。プロジェクトを完全にクリーンアップして再構築してみます。

を使用する代わりに直接呼び出しを伴うものについては、次のperformSelectorことがわかりますafterDelay

[self performSelector:@selector(didFailLoadWithError:) withObject:error afterDelay:0];

これdidFailLoadWithError:により、実行ループの次の反復でメソッドが呼び出されます。私はそれをこのように呼ぶことにします。

ただし、次の方法で試すことができます。

dispatch_async(dispatch_get_current_queue(), ^() { 
                       [self didFailLoadWithError:error]; } );

使用しているRestKitメソッド内にブレークポイントを設定して(おそらくsendAsynchronously)、何が起こるかを確認することをお勧めします。メソッド定義を調べると、デリゲートへの呼び出しは事実上そこにあります。

    } else {
        self.loading = YES;

        RKLogError(@"Failed to send request to %@ due to unreachable network. Reachability observer = %@", [[self URL] absoluteString], self.reachabilityObserver);
        NSString* errorMessage = [NSString stringWithFormat:@"The client is unable to contact the resource at %@", [[self URL] absoluteString]];
        NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:
                                  errorMessage, NSLocalizedDescriptionKey,
                                  nil];
        NSError* error = [NSError errorWithDomain:RKErrorDomain code:RKRequestBaseURLOfflineError userInfo:userInfo];
        [self performSelector:@selector(didFailLoadWithError:) withObject:error afterDelay:0];
    }
于 2013-01-14T15:29:34.750 に答える