NSURL Обработка ошибок - PullRequest
0 голосов
/ 24 июля 2010

мое приложение должно отправлять запрос от сервера каждые 10 секунд или около того с определенным URL-адресом, изменять некоторые атрибуты в URL-адресе, а затем отображать запрос в другом представлении, называемом «updateView», или при отображении любой сетевой ошибкиОшибка.Первая часть работает нормально, но если я переключаю Wi-Fi, например, приложение вылетает.Как я могу это исправить и как я могу отображать различные ошибки?Заранее спасибо!!Вот мой код (этот метод вызывается каждые 10 секунд):

- (void)serverUpdate{
CLLocationCoordinate2D newCoords = self.location.coordinate;

gpsUrl = [NSURL URLWithString:[NSString stringWithFormat:@"http://odgps.de/chris/navextest?objectid=3&latitude=%2.4fN&longitude=%2.4fE&heading=61.56&velocity=5.21&altitude=%f&message=Eisberg+voraus%21", newCoords.latitude, newCoords.longitude, self.location.altitude]];

self.pageData = [NSString stringWithContentsOfURL:gpsUrl];


[updateView.transmissions insertObject:pageData atIndex:counter];
if (counter == 100) {
    [updateView.transmissions removeAllObjects];
    counter = -1;
}
counter = counter + 1;



    [updateView.tableView reloadData];
self.sendToServerSuccessful = self.sendToServerSuccessful + 1;
[self.tableView reloadData];
}

Ответы [ 2 ]

3 голосов
/ 24 июля 2010

Во-первых, вы блокируете основной поток, пока он ожидает завершения сетевой операции при вызове stringWithContentsOfURL:, и это плохо, потому что, если сеть медленная или недоступна, будет выглядеть, как будто ваше приложение упало.

Во-вторых, stringWithContentsOfURL: устарела, и вы должны использовать это вместо этого, даже если он все еще блокирует основной поток:

self.pageData = [NSString stringWithContentsOfURL:gpsURL encoding:NSUTF8StringEncoding error:nil];

Вы должны использовать NSURLConnection для загрузки данных без блокировкиосновная нить.Создайте NSURLRequest из URL, передайте его [NSURLConnection connectionWithRequest:request delegate:self];, который запускает соединение URL.

Вот некоторый код для делегата NSURLConnection:

- (void)connection:(NSURLConnection *)aConnection didReceiveResponse:(NSURLResponse *)response {
    if ([response isKindOfClass: [NSHTTPURLResponse class]]) {
        statusCode = [(NSHTTPURLResponse*) response statusCode];
        /* HTTP Status Codes
            200 OK
            400 Bad Request
            401 Unauthorized (bad username or password)
            403 Forbidden
            404 Not Found
            502 Bad Gateway
            503 Service Unavailable
         */
    }
    self.receivedData = [NSMutableData data];
}

- (void)connection:(NSURLConnection *)aConnection didReceiveData:(NSData *)data {
    [self.receivedData appendData:data];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)aConnection {
    // Parse the received data
    [self parseReceivedData:receivedData];
    self.receivedData = nil;
}   

- (void)connection:(NSURLConnection *)aConnection didFailWithError:(NSError *)error {
    statusCode = 0; // Status code is not valid with this kind of error, which is typically a timeout or no network error.
    self.receivedData = nil;
}
0 голосов
/ 24 июля 2010

Выполнить следующие изменения:

1. Изменение звонка на

    + (id)stringWithContentsOfURL:(NSURL
*)url encoding:(NSStringEncoding)enc error:(NSError **)error

В настоящее время вы используете stringWithContentsOfURL.

2. Обращаем nil-значение, которое возвращает этот вызов. если есть какая-либо ошибка в выполнении URL, вызов возвращает nil-объект. в данной реализации вы просто добавляете объектный возврат API (думаю, это может быть причиной вашего сбоя)

...