Как настроить HTTP-соединение в специальном классе? - PullRequest
2 голосов
/ 10 марта 2009

Я хочу создать класс для обработки всей работы HTTP-соединения для других классов (чтобы избежать повторного написания кодов). Я называю это ConnectionCenter (подкласс NSObject) и добавляю в него следующие коды:

-(void)connect:(NSString *)strURL obj:(ConnectCenter *)objConnect
{
    NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:strURL]
                                              cachePolicy:NSURLRequestUseProtocolCachePolicy
                                          timeoutInterval:60.0];

    NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:objConnect];
    if (theConnection) 
    {
        // receivedData is declared as a method instance elsewhere
        receivedData = [[NSMutableData data] retain];
    } 
    else 
    { 
        // inform the user that the download could not be made
    }

}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    // append the new data to the receivedData
    // receivedData is declared as a method instance elsewhere
    [receivedData appendData:data];
}

И другие классы вызывают его, передавая URL-адрес и объект ConnectionCenter. Но метод didReceiveData в ConnectionCenter не вызывается. Любые идеи о том, в чем проблема с этим?

Ответы [ 2 ]

2 голосов
/ 10 марта 2009

Вам нужно будет позвонить [theConnection setDelegate:self] после настройки соединения, поскольку connection:didReceiveData: является методом делегата.

Для получения дополнительной информации прочитайте документацию .

0 голосов
/ 10 марта 2009

Несколько вещей об этом коде ...

Во-первых, сбивает с толку, какой объект вы на самом деле устанавливаете в качестве делегата. Вызов соединения: didReceiveData: будет вызываться для делегата соединения, которым является любой объект, который вы передали в свой метод connect: obj:. Кажется странным, что у вас есть метод экземпляра в ConnectionCenter, который может запустить соединение с другим объектом ConnectionCenter в качестве делегата. Убедитесь, что вы смотрите на соединение: didReceiveData: метод на нужном объекте.

Если вы не получаете никаких данных, возможно, ваше соединение либо не удалось подключиться, либо просто завершилось без возврата каких-либо данных. Вам следует реализовать методы connectionDidFinishLoading: и connection: didFailWithError: делегировать, чтобы вы знали, завершилось ли соединение с возвратом данных или без них.

Наконец, у вас есть состояние гонки, которое вас укусит, если вы получите хорошее и быстрое соединение. Объект NSURLConnection запустится, как только вы его создадите. Если есть какие-либо данные для чтения, они вызовут соединение: didReceiveData: и вы добавите их к полученным данным. Но если соединение достаточно быстрое, вы можете в конечном итоге попытаться добавить данные к полученным данным, которые еще не были созданы. Это небольшой шанс, но даже несмотря на то, что метод init NSURLConnection не блокируется, неразумно делать какие-либо предположения о том, сколько он проделывает, чтобы установить соединение, прежде чем вернуться. Создайте ReceiveData перед началом подключения, чтобы вы могли быть уверены, что у вас есть место для размещения данных при их поступлении.

...