2014-01-05 2 views
0

Я выполняю запрос NSURL асинхронно. Он работает отлично по большей части, но иногда он возвращает 200 OK для хостов, которые явно фиктивные. Вот код для подключения:Значения, смешавшиеся в запросе NSURL async

-(void)checkConnectionForHost:(NSString*)host completion:(completion_t)completionHandler 
{ 
    NSURLRequest* request = [[NSURLRequest alloc]initWithURL:[NSURL URLWithString:host]]; 
    if([NSURLConnection canHandleRequest:request]){ 
     [NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc]init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { 
     if(completionHandler) 
     { 
      completionHandler(connectionError == nil && [(NSHTTPURLResponse*)response statusCode]==200); 
     } 
     }]; 
    } 

} 

И обработчик завершения:

typedef void (^completion_t)(BOOL isReachable); 

Я звоню эту команду для каждой ячейки в моем источнике данных в методе collectionView:cellForItem... делегата.

Причина, я знаю, что это не работает, потому что я послал в некотором случайном хозяине, как 8107341897309 и он сразу же вернулся 0 статус, но затем изменено на 200. Кроме того, если я отправляю значение со строкой, он остается 0. Когда я отправляю значение с целыми или десятичными знаками, это продолжает прыгать. Любое понимание было бы здорово!

EDIT: Поэтому иногда, когда он соединяется, он возвращает 0, а иногда возвращает 200. Я пытался сказать, что результаты несовместимы.

EDIT 2: Решил записать результаты, которые я получил в collectionView:cellForItemAtIndexPath и получил это:

2014-01-04 19:22:53.390 ServerObserver[5624:4703] http://192.168.1.11 is Reachable? : 1. Index: 0 
2014-01-04 19:22:53.414 ServerObserver[5624:3707] http://apple.com is Reachable? : 1. Index: 6 
2014-01-04 19:22:53.619 ServerObserver[5624:4003] http://192.168.1.11 is Reachable? : 1. Index: 0 
2014-01-04 19:22:53.697 ServerObserver[5624:5603] http://google.com is Reachable? : 1. Index: 1 
2014-01-04 19:22:53.696 ServerObserver[5624:4003] http://pandora.com is Reachable? : 1. Index: 5 
2014-01-04 19:22:53.705 ServerObserver[5624:4003] http://apple.com is Reachable? : 1. Index: 6 
2014-01-04 19:22:53.732 ServerObserver[5624:5603] http://reddit.com is Reachable? : 1. Index: 4 
2014-01-04 19:22:53.781 ServerObserver[5624:1803] http://google.com is Reachable? : 1. Index: 1 
2014-01-04 19:22:53.893 ServerObserver[5624:5603] http://twitter.com is Reachable? : 1. Index: 3 
2014-01-04 19:22:53.896 ServerObserver[5624:5603] http://reddit.com is Reachable? : 1. Index: 4 
2014-01-04 19:22:53.891 ServerObserver[5624:1803] http://pandora.com is Reachable? : 1. Index: 5 
2014-01-04 19:22:54.038 ServerObserver[5624:4003] http://twitter.com is Reachable? : 1. Index: 3 
2014-01-04 19:22:54.268 ServerObserver[5624:5603] http://facebook.com is Reachable? : 1. Index: 2 
2014-01-04 19:22:54.317 ServerObserver[5624:5603] http://facebook.com is Reachable? : 1. Index: 2 

Некоторые вещи, чтобы отметить, что это барахло IP даже не показывает здесь, потому что я проверяю в предыдущем метод, если запрос «может быть сделан». Но почему каждый IP называется дважды? Каждая ячейка имеет только один IP-адрес.

+0

Уход за разъяснением: «сразу же вернулся статус 0, но затем был изменен на 200»? – zaph

+0

Используйте сетевой анализатор, такой как Charles Proxy, чтобы точно видеть, что отправляется и принимается. – zaph

+0

Извините за путаницу, я обновил OP – Carpetfizz

ответ

0

Почему бы не использовать проверить, если URL существует, как это:

- (BOOL)urlExistsOnServer:(NSString *)strURL 
{ 
    NSURL *url = [NSURL URLWithString:strURL]; 
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 
    [request setHTTPMethod:@"HEAD"]; 
    NSURLResponse *response = nil; 
    NSError *error=nil; 
    NSData *data = [[NSData alloc] initWithData:[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]]; 
    NSMutableArray *json = (NSMutableArray*)[NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error]; 
    NSString *retVal = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
    // you can use retVal , ignore if you don't need. 
    NSInteger httpStatus = [((NSHTTPURLResponse *)response) statusCode]; 
    NSLog(@"responsecode:%d retVal:%@\njson:%@", httpStatus,retVal,json); 

    if(httpStatus != 200) 
    { 
     return NO; 
    } 
    return YES; 
} 

Если вам нужно проверить URL асинхронно вам нужно будет уточнить этот код, но это работает для меня.

+0

Нет никакого преимущества, используя этот код над OPs, за исключением того, что HEAD может быть лучше. Однако этот подход не будет работать надежно: например, если сервер требует аутентификации, он может отвечать другим кодом состояния, чем 200 (OK), но на самом деле он «доступен». (см. SCNetworkReachability для проверки доступности) – CouchDeveloper

+0

Спасибо, в моем приложении сервер известен, и я проверяю, существует ли файл, добавляя к URL-адресу имя файла. Поэтому в моем случае этот код отлично работает (; –