0

Web サービス ポストを呼び出して情報を更新するプログラムがありますが、DNS 解決に失敗した場合、アプリはエラーが返るまで約 30 秒待機してから、通常の実行を続行します。

注: Web サービスの投稿が失敗した場合でも、アプリケーションは正常に実行できるため、応答を待ちたくありません。投稿して先に進むだけで、いつでもエラーが返されます。

以下は、エラー 410 で返される send メソッドです。

// Sends the request via HTTP.
-(void)send {

    // If we don't have a handler, create a default one
if(handler == nil) {
    handler = [[SoapHandler alloc] init];
}

// Make sure the network is available
if([SoapReachability connectedToNetwork] == NO) {
    NSError* error = [NSError errorWithDomain:@"SoapRequest" code:400 userInfo:[NSDictionary dictionaryWithObject:@"The network is not available" forKey:NSLocalizedDescriptionKey]];
    [self handleError: error];
}

// Make sure we can reach the host
if([SoapReachability hostAvailable:url.host] == NO) {
    NSError* error = [NSError errorWithDomain:@"SoapRequest" code:410 userInfo:[NSDictionary dictionaryWithObject:@"The host is not available" forKey:NSLocalizedDescriptionKey]];
    [self handleError: error];
}

// Output the URL if logging is enabled
if(logging) {
    NSLog(@"Loading: %@", url.absoluteString);
}

// Create the request
NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL: url];
if(soapAction != nil) {
    [request addValue: soapAction forHTTPHeaderField: @"SOAPAction"];
}
if(postData != nil) {
    [request setHTTPMethod: @"POST"];
    [request addValue: @"text/xml; charset=utf-8" forHTTPHeaderField: @"Content-Type"];
    [request setHTTPBody: [postData dataUsingEncoding: NSUTF8StringEncoding]];
    if(self.logging) {
        NSLog(@"%@", postData);
    }
}

// Create the connection
conn = [[NSURLConnection alloc] initWithRequest: request delegate: self];
if(conn) {
    receivedData = [[NSMutableData data] retain];
} else {
    // We will want to call the onerror method selector here...
    if(self.handler != nil) {
        NSError* error = [NSError errorWithDomain:@"SoapRequest" code:404 userInfo: [NSDictionary dictionaryWithObjectsAndKeys: @"Could not create connection", NSLocalizedDescriptionKey,nil]];
        [self handleError: error];
        }
    }
}

どんな提案でも大歓迎です!

前もって感謝します。:)

4

2 に答える 2

1

いくつかのリターンを追加したい場合があります。ホストに到達できない場合、接続試行を続行したくないと思います。

また、操作の 1 つがスレッドをブロックしている場合は、send メソッド全体をバックグラウンド キューで実行することをお勧めします。

于 2012-10-02T22:11:06.820 に答える
0

dipatch_queue スレッドを使用する場合、スレッドはブロックされません。私のコードは次のとおりです。

    if(connectToHostQueue != NULL)
{
    dispatch_release(connectToHostQueue);
    dispatch_suspend(connectToHostQueue);
    connectToHostQueue = NULL;
}

connectToHostQueue = dispatch_queue_create("hostAvailable",NULL);
dispatch_async(connectToHostQueue, ^{
        isHostAvailable = [SoapReachability hostAvailable:url.host];

    dispatch_async(dispatch_get_main_queue(), ^{

        // don't want to continue if process is canceled
        if(isCancel)
        {
            return;
        }

            // Connection process here..............

...................................

             });
});
于 2013-06-06T15:09:03.520 に答える