1

深刻な問題があります。私のアプリでは、NSURLConnectionを使用してXMLファイルをダウンロードしています。ここまでは順調ですね。しかし、cachePolicyをNSURLRequestReloadIgnoringLocalAndRemoteCacheDataに設定したにもかかわらず、NSURLConnectionが要求されたファイルの古いバージョンを返すことがあります。バグの本当に嫌な部分は、アクティブにしてから機内モードを非アクティブにするか、デバイスを再起動するまで、接続が常に古いバージョンのファイルを返すことです。

もう1つの興味深い事実は、Wifiをアクティブにしてアプリを呼び出してファイルをリロードすると、ファイルの正しい実際のバージョンが返されることです。しかし、Wifiをオフにした後、古いバージョンは再び再調整されます。

私は本当にこの問題に必死になっていて、誰かが私を助けてくれることを願っていますか?

これが私のクラスのコードで、ファイルをダウンロードしています。

#import "HTTPReciever.h"
#import "Constants.h"

@interface HTTPReciever ()
@property (strong, nonatomic) NSMutableData *receivedData;
@property (strong, nonatomic) NSString *directoryPath;
@property (strong, nonatomic) NSString *filename;
@property (assign, nonatomic) BOOL storeData;
@end

@implementation HTTPReciever
@synthesize receivedData = _receivedData;
@synthesize delegate = _delegate;
@synthesize directoryPath = _directoryPath;
@synthesize filename = _filename;


- (BOOL)recieveDataFromURL:(NSURL *)url
      storeAtDirectoryPath:(NSString *)directoryPath
                  withName:(NSString *)name
{
    [self setDirectoryPath:directoryPath];
    [self setFilename:name];
    [self setStoreData:YES];
    return [self recieveDataFromURL:url];
}

- (BOOL)recieveDataFromURL:(NSURL *)url
{
    NSURLRequest *theRequest = [[NSURLRequest alloc] initWithURL:url
                                                     cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData
                                                 timeoutInterval:cDefaultHTTPTimeOutInterval];

    self.receivedData = nil;
    self.receivedData = [[NSMutableData alloc] initWithLength:0];
    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:theRequest
                                                                  delegate:self
                                                          startImmediately:NO];
    if ([NSURLConnection canHandleRequest:theRequest] && connection) {
        [connection start];
        return YES;
    } else {
        return NO;
    }
}



#pragma mark - NSURLConnectionDelegate protocol
- (void)connection:(NSURLConnection *)connection
     didReceiveData:(NSData *)data
{
    [self.receivedData appendData:data];
}

- (void)connection:(NSURLConnection *)connection
didReceiveResponse:(NSURLResponse *)response
{
    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
    [self.receivedData setLength:0];
    if ([response isKindOfClass:[NSHTTPURLResponse self]]) {
        NSDictionary *headers = [(NSHTTPURLResponse *)response allHeaderFields];
        NSString *modified = [headers objectForKey:@"Last-Modified"];
        if (modified) {
            // not yet used
        }
    }
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;

    if (self.storeData) {
        [[NSFileManager defaultManager] createDirectoryAtPath:self.directoryPath
                                  withIntermediateDirectories:YES
                                                   attributes:nil
                                                        error:nil];
        [self.receivedData writeToFile:[NSString stringWithFormat:@"%@%@", self.directoryPath, self.filename]
                            atomically:YES];
    }

    [self.delegate receiver:self
       didFinishLoadingData:self.receivedData
                lastVersion:YES];
}

- (void)connection:(NSURLConnection *)connection
  didFailWithError:(NSError *)error
{
    [self.delegate receiverFailedLoadingData:self];
}

- (NSCachedURLResponse *)connection:(NSURLConnection *)connection
                  willCacheResponse:(NSCachedURLResponse *)cachedResponse
{
    return nil;
}


@end
4

0 に答える 0