3

これは Xcode 4.4 では発生しませんが、4.5 では、ios6 シミュレーターまたは実際のデバイスを使用して、cachedResponseForRequest 内から呼び出された場合、sendSynchronousRequest への呼び出しはタイムアウトになるまで戻りません。

同様に、sendAsynchronousRequest を使用してスピンし (10 秒間、0.05 秒ごとに完了をチェックする)、ループを終了します (10 秒経過) が、要求を完了することはありません (cachedResponseForRequest 内から呼び出された場合)。

Xcode 4.4 (ios5 をエミュレート) では、これは発生しません。何か案は?

4

1 に答える 1

0

メソッド「sendAsynchronousRequest」を使用するだけです。ここに私の解決策があり、それは魅力のように機能します。

[NSURLConnection sendAsynchronousRequest:newRequest queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data,NSError *error){
        NSLog(@"--- caching ---");
        if (error) {
            NSLog(@"%@", error);
            NSLog(@"not cached: %@", absoluteString);
        }
        NSString *filename = [self sha1:absoluteString];
        NSString *path = [cacheDirectory stringByAppendingPathComponent:filename];
        NSFileManager *fileManager = [[NSFileManager alloc] init];
        [fileManager createFileAtPath:path contents:data attributes:nil];
        [fileManager release];

        NSURLResponse *newResponse = [[NSURLResponse alloc] initWithURL:response.URL MIMEType:response.MIMEType expectedContentLength:data.length textEncodingName:nil];

        NSDictionary *responseInfo = [NSDictionary dictionaryWithObjectsAndKeys:filename, @"filename", newResponse.MIMEType, @"MIMEType", nil];
        [responsesInfo setObject:responseInfo forKey:absoluteString];
        cachedResponse = [[NSCachedURLResponse alloc] initWithResponse:newResponse data:data];
        [newResponse release];
        [cachedResponses setObject:cachedResponse forKey:absoluteString];
        [cachedResponse release];
    }];

iOS5.0以降でしか利用できないためです。最初に iOS のバージョンを確認する必要があるかもしれません。

于 2012-11-20T08:36:36.593 に答える