Вопрос

У меня чертовски много времени с чем-то, что кажется довольно
прямолинейно, но, кажется, я не могу приступить к работе.Я строю
Приложение для iPhone, которое извлекает данные с веб-хостинга.Я пытаюсь
установите асинхронное соединение с хостом, поскольку я хочу сохранить
устройство освободилось во время подключения.(sendSynchronousRequest зависает
телефона до тех пор, пока запрос не будет выполнен.) Вот мой код подключения:

//temp url to see if data is returned:
NSURL *theURL = [NSURL URLWithString:@"http://www.theappleblog.com/feed"];

NSURLRequest *dataRequest = [NSURLRequest requestWithURL:theURL
             cachePolicy:NSURLRequestReloadIgnoringLocalCacheData
             timeoutInterval:60];

/* establish the connection */  
theConnection = [[NSURLConnection alloc]
                 initWithRequest:dataRequest
                        delegate:self
                startImmediately:YES];

if (theConnection == nil) { 
    NSLog(@"Connection Failure!");
    self.urlData = nil; 
} else {
    self.urlData = [[NSMutableData data] retain];   
}

У меня настроены все соответствующие методы делегирования:

-(void)connection:(NSURLConnection *)connection
       didReceiveResponse:(NSURLResponse*)response
{
    [urlData setLength:0];
    UIApplication *application = [UIApplication sharedApplication];
    application.networkActivityIndicatorVisible = YES;
    NSLog(@"Received Response!");
}

-(void)connection:(NSURLConnection *)connection
       didReceiveData:(NSData*)incrementalData
{
    [self.urlData appendData:incrementalData];

    NSNumber *resourceLength = [NSNumber
              numberWithUnsignedInteger:[self.urlData length]];
    NSLog(@"resourceData length: %d", [resourceLength intValue]);
    NSLog(@"filesize: %d", self.urlDataSize);
    NSLog(@"float filesize: %f", [self.urlDataSize floatValue]);
}

-(void)connectionDidFinishLoading:(NSURLConnection*)connection
{
    NSLog(@"Connection finished loading\n");
    NSLog(@"Succeeded! Received %d bytes of data",[urlData length]);
    _isFinished = YES;
    UIApplication *application = [UIApplication sharedApplication];
    application.networkActivityIndicatorVisible = NO;
}

- (void)connection:(NSURLConnection *)connection
        didFailWithError:(NSError *)error
{
    NSLog(@"Error: %@",[error localizedDescription]);
}

Как вы можете видеть, у меня есть куча лог-сообщений, потому что я хотел
чтобы увидеть, есть ли что угодно вообще ничего не получалось.Мой тест на подключение
возвращается как TRUE, но никакие данные никогда не загружаются.Как я уже сказал, я уверен
Я, должно быть, что-то делаю (или не делаю) действительно глупый.Но что?
Любая помощь была бы очень признательна.

Спасибо, Лоуренс

Это было полезно?

Решение

Это не дает прямого ответа на ваш вопрос, но вы могли бы рассмотреть возможность заглянуть в книгу Бена Копси ASIHTTPRequest библиотека, которая охватывает CFNetwork классы и включает в себя асинхронный многопоточный код запроса, выполнение которого требует много усилий для правильного выполнения этого.

Другие советы

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

Несколько предложений:

  • В вашем первом фрагменте вместо theConnection попробуйте назначить self.theConnection чтобы убедиться, что методы доступа к свойству вызваны.В разных местах вы также меняетесь местами self.urlData и urlData.Возможно, захочется сделать их все согласованными, пройдя через self.

  • Возможно, вы захотите сделать dataRequest свойство, а также и пройти через self чтобы убедиться, что он будет сохранен.

  • self.urlData = [[NSMutableData data] retain]; -- тебе не должно понадобиться это дополнительное удержание.Проходя через self делает это за тебя.Дополнительная фиксация приведет к тому, что предмет будет прилипать и протекать, даже когда все будет сделано.

  • В связи с этим, в ваших NSLogs убедитесь, что вы распечатали количество сохранений для каждого объекта.Кроме того, вы можете захотеть выполнить общую процедуру очистки, чтобы освободить эти структуры (или наборы self.foo = nil) таким образом, в любой момент, если его вырвет, вы можете вызвать процедуру, чтобы все привести в порядок.

  • Получите копию Charles или WireShark (или запустите tcpdump в консоли) и следите за сетевым трафиком.Это поможет точно определить, на каком этапе потока происходит сбой.

Первоначальная мысль - правильно ли сохраняется объект, содержащий весь этот код?Возможно, он освобождается и, таким образом, освобождает соединение...

В противном случае вы должны, по крайней мере, увидеть ответ.

Там, наверху, явно ничего не случилось.У меня есть код, который практически такой же и работает нормально.Единственные различия, которые я вижу, это:

  • Я использую NSURLRequestUseProtocolCachePolicy вместо NSURLRequestReloadIgnoringLocalCacheData

  • Я использую connection=[[NSURLConnection alloc] initWithRequest:делегат запроса:self];вместо того, чтобы указывать startImmediately:ДА (поскольку это значение по умолчанию)

Было бы полезно узнать, какие из ваших методов делегирования вызываются, если таковые имеются,.По крайней мере, вы должны получить хотя бы одно или другое из вызываемых connectionDidFinishLoading или connectionDidFail .Если нет, то, вероятно, что-то не так с настройкой вашего делегата - вы АБСОЛЮТНО уверены, что сигнатуры метода делегирования верны и что вы передаете правильный элемент в качестве делегата?

Трудно сосредоточиться на чем-либо, поскольку из вашего вопроса неясно, какой, если выполняется какой-либо из операторов NSLog.Пожалуйста, будьте немного более ясны в отношении результатов, которые вы получаете.

При беглом взгляде единственное, что выглядит как потенциальная проблема, - это то, что у вас возникает состояние гонки при настройке соединения.Если сеть особенно быстра, существует небольшая, но ненулевая вероятность того, что -соединение:didReceiveData Получил данные:будет вызван до того, как self.urlData будет выделен.Я бы предложил выделить urlData либо перед инициированием соединения, либо при подключении:didReceiveResponse:чтобы предотвратить это.

Если это не исправит проблему, потребуется дополнительная информация от вас.

Вы говорите, что этот код отлично работает с использованием асинхронного метода?Тестируя этот URL, он перенаправляет на другой, так что, если вы реализуете методы делегирования перенаправления?Что, если вы попробуете несколько разных URL-адресов?

Является ли приложение в остальном отзывчивым?Запущен ли runloop?Что делает приложение после запуска запроса - возвращается ли оно из своего обработчика событий обратно в runloop?(Если нет, вы никогда не получите ни одного из ваших обратных вызовов, потому что они доставляются через runloop.)

NSURLConnection предназначен для работы с любым типом протокола, а не только с HTTP.Это означает, что connection:didFail:withError вызывается для соединение ошибки, но не для протокол ошибки.Вы не проверяете наличие ошибок протокола - вы должны перехватывать их в connection:didReceiveResponse:.Хитрость заключается в том, что объект ответа, который передается, на самом деле является объектом NSHTTPURLResponse .Если вы проверите StatusCode ответа, я готов поспорить, что вы получаете HTTP-ошибку, такую как 404 или server 500.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top