NSURLConnection Данные прерваны в асинхронном соединении - PullRequest
1 голос
/ 21 августа 2010

У меня есть NSURLConnection, который получает выходные данные из URL, указывающего на скрипт php на моем сервере.

В большинстве случаев все работает нормально, и данные извлекаются в полном виде.

Однако иногда я получаю NULL или поврежденные (т.е. нижнюю половину) данные по адресу:

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 

Когда это происходит, если я перезагружаю соединение, оно всегда возвращает тот же нулевой или поврежденный блок данныхдля запроса.

РЕДАКТИРОВАТЬ *: Я понял, что когда я получаю то, что я думал, было нулевыми данными, я фактически получал данные, но NSString, созданный из этих данных, равен нулю.Я все еще не понимаю, почему, хотя.Мой вывод php-кодировки всегда UTF-8, поэтому я не думаю, что это проблема кодирования, и к тому же он работает большую часть времени с этим.

Я проверил php-скрипт с тем же запросом для проверкичто это не проблема на стороне сервера или со сценарием php, и подтвердил, что это НЕ.

Мой код ниже:

-(void)setUpConnectionAndMakeRequest {

            NSString *URLpath = @"http://www.example.com/myphp.php"; 
    NSURL *myURL = [[NSURL alloc] initWithString:URLpath];

    NSMutableURLRequest *myURLRequest = [NSMutableURLRequest requestWithURL:myURL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:60];
    [myURL release];
    [myURLRequest setHTTPMethod:@"POST"];


    //I added this because I thought it may be a problem relating to cache but it isn't
    NSURLCache *cache = [NSURLCache sharedURLCache]; 
    [cache removeAllCachedResponses];


    NSString *httpBodystr = [NSString stringWithString:@"command=runscript"];


    [myURLRequest setHTTPBody:[httpBodystr dataUsingEncoding:NSUTF8StringEncoding]];


    [mailData setData:nil]; //mailData is a NSMutableData object which accumulates the data retrieved by the request

    [NSURLConnection connectionWithRequest:myURLRequest delegate:self];

}


- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {

NSString *untrimmedDataSTR = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];  //Created so I can see the data (always text) in NSLog
NSLog(@"Live Data: %@", untrimmedDataSTR);   //This is where I see that the data is broken or null when it shouldn't be


[mailData appendData:data];  //Append accumulated data to NSMutableData object used later in my app.

[untrimmedDataSTR release]; 

}

Любая помощь будет принята с благодарностью.

1 Ответ

4 голосов
/ 21 августа 2010

В соответствии с ссылкой NSString , -initWithData:encoding: возвращает nil, если "инициализация не выполнена по какой-либо причине (например, если данные не представляют действительные данные для кодирования)."

Топочти наверняка означает, что ответ от сервера, на самом деле, не является данными в кодировке UTF-8.

Для проверки можно использовать NSLog данных до попытки преобразования в строку NSString.:

NSLog(@"Raw Data: %@", data);

(Метод -description для NSData возвращает шестнадцатеричное представление содержимого; это то, что будет записано в журнал).

...