1

面白いプログラミングパズル...

エラーをnilに初期化できなかったため、以下のコードがクラッシュします。

    NSString *query = [NSString stringWithFormat:@"http://mysite.com/getlatest.php?a=%@", aSuiteName];
    NSURL *url = [NSURL URLWithString:query];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLCacheStorageNotAllowed timeoutInterval:10];
    [request setHTTPMethod:@"GET"];
    NSURLResponse *response = nil;
    NSError *error;
    NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
    if ( !data || error != nil ) {
        NSLog(@"Error downlading %@", error); //CRASH
        return NO;
    }

私の質問は、sendSynchronousRequest:returningResponse:error:が実際にエラーを受信し、それでもデータのダウンロードを続行するようなエラーをサーバーに返すにはどうすればよいですか?NSErrorオブジェクトに初期化されるエラーを引き起こす、ある種の致命的でないエラー?

これは、以前は完全に失敗することなくステータス情報を返したいという同様の難問に関連しています。ですから、あいまいですが、そのためのテクニックがあるかどうか知りたいです。

これはCocoaの質問ですが、答えはphpにあると思います。何かのようなもの

<?php

    header( set 503 error here );

    return data;

?>
4

1 に答える 1

0

これは、データをNSErrorオブジェクトにラップすることで処理します。プレーンテキストの応答の場合、私はその応答をlocalizedDescriptionとしても使用します。別の方法を使用して、結果が成功したかどうかを評価します。URLリクエスト自体がエラーを生成した場合も、それは失敗と見なし、URLリクエストによって提供されたNSErrorを渡します。

これは私のServerRequestクラスから抜粋されています:

+ (NSError *) errorForStatusCode:(NSInteger) statusCode
                     contentType:(NSString *) contentType
                textEncodingName:(NSString *) textEncodingName
                            data:(NSData *) data {

    NSMutableDictionary *userInfo = [NSMutableDictionary dictionary];
    if ([contentType isEqualToString:@"text/plain"]) {
        [userInfo setValue:[[NSString alloc] initWithData:data encoding:[self stringEncodingForTextEncodingName:textEncodingName]]
                    forKey:NSLocalizedDescriptionKey];
    } else if ( ... ) {
        // handle other relevant types         
    }

    return [NSError errorWithDomain:[[self class] description]
                               code:statusCode
                           userInfo:userInfo];
}

- (BOOL) statusCodeIndicatesSuccess:(NSInteger) statusCodeValue {
    return 201 == statusCodeValue; // Modify this based on your API
}

- (BOOL) runSynchronouslyReturningResult:(NSData **) resultPtr error:(NSError **) errorPtr {
    NSHTTPURLResponse *response = nil;
    NSError *error = nil;
    NSData *result = [NSURLConnection sendSynchronousRequest:[self request] returningResponse:&response error:&error];
    if (error) {
        if (errorPtr) *errorPtr = error;
        return NO;
    }

    self.statusCode = [response statusCode];
    self.MIMEType = [response MIMEType];
    self.textEncodingName = [response textEncodingName];
    if ([self statusCodeIndicatesSuccess:self.statusCode]) {
        if (resultPtr) *resultPtr = result;
        return YES;
    } else {
        if (errorPtr) *errorPtr = [ServerRequest errorForStatusCode:self.statusCode
                                                        contentType:self.MIMEType
                                                   textEncodingName:self.textEncodingName
                                                               data:result];
        if (resultPtr) *resultPtr = result;
        return NO;
    }
}
于 2012-05-18T16:40:40.237 に答える