Удаленный файл iPhone SDK существует без кеша

Мне нужно проверить, существует ли файл на моем сервере без использования кеша. Все методы, которые я использовал, возвращают 200, даже если файл не существует, поэтому я могу только предположить, что проблема с кешем или есть проблема с моим кодом.

Вот мой код: для аргументов... URL-адрес изменен в этом примере, но URL-адрес правильный в моем коде.

NSString *auth = [NSString stringWithFormat:@"http://www.mywebsite.com/%@.txt",[self aString]];
NSURL *authURL = [NSURL URLWithString:auth];

NSURLRequest* request = [NSURLRequest requestWithURL:authURL 
                                         cachePolicy:NSURLRequestReloadIgnoringCacheData
                                     timeoutInterval:5.0];
NSURLConnection *conn = [NSURLConnection connectionWithRequest:request
                                                      delegate:self];

NSHTTPURLResponse* response = nil;
NSError* error = nil;
[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
NSLog(@"statusCode = %d", [response statusCode]);

if ([response statusCode] == 404)
    NSLog(@"MISSING");
else
    NSLog(@"EXISTS");

ответ всегда 200, даже если я переименовываю файл на сервере.


person WrightsCS    schedule 27.08.2010    source источник
comment
Покажите свой код, пожалуйста. У вас будет гораздо больше шансов получить ответы, если мы сможем увидеть, что происходит.   -  person Jason Jenkins    schedule 27.08.2010


Ответы (2)


Есть пара потенциальных проблем с вашим кодом. Во-первых, когда вы создаете conn с помощью connectionWithRequest:delegate:, вы запускаете асинхронный запрос. Ответ будет получен делегатом (self в вашем случае) connection:didReceiveResponse: методом. Вы пытаетесь выполнить запрос асинхронно? Однако из остальной части вашего кода похоже, что вы на самом деле пытаетесь выполнить синхронный запрос. Вот для чего нужен sendSynchronousRequest:returningResponse:error:. Если это то, что вы намереваетесь, то вам не нужен более ранний вызов для создания соединения.

Предполагая, что это так, вам нужно захватить и проверить значение, возвращаемое при вызове sendSynchronousRequest:returningResponse:error:. Он вернет ноль, если соединение не удалось, что, как я подозреваю, и происходит. Затем вы можете посмотреть на возвращенную ошибку, чтобы выяснить, что происходит. Попробуйте что-то вроде:

NSData * result = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

if (result != nil) {
   NSLog(@"statusCode = %d", [response statusCode]);

   if ([response statusCode] == 404)
    NSLog(@"MISSING");
   else
       NSLog(@"EXISTS");
} else {
  NSLog(@"%@", error);
}
person Jason Jenkins    schedule 27.08.2010
comment
На самом деле это был мой сервер. Я использую пользовательские документы об ошибках, поэтому я просто отключил 404 и вуаля! - person WrightsCS; 28.08.2010

Возможно ли кэширование на стороне сервера? Если это так, вы можете попробовать NSURLRequestReloadIgnoringLocalAndRemoteCacheData вместо NSURLRequestReloadIgnoringCacheData.

person amrox    schedule 27.08.2010