Создание нескольких NSURLConnections. Как определить который Асинхронный вызов

Поскольку C-время-выполнения переходит к настройкам проекта, выбирает C/C ++ тогда 'Генерация кода'. Измените настройки 'библиотеки времени выполнения' на 'многопоточный' вместо 'многопоточного dll'.

, Если Вы пользуетесь какими-либо другими библиотеками, Вы, возможно, должны сказать компоновщику игнорировать динамично связанный CRT явно.

10
задан Xetius 12 September 2009 в 18:53
поделиться

4 ответа

Сохраните оба объекта NSURLConnection как переменные-члены любого объекта делегата, который вы передали в connectionWithRequest: delegate :. Затем вы можете просто сравнить каждый из них с NSURLConnection, переданным в connectionDidFinishLoading :, и ответить соответствующим образом:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    if (connection == firstConnection) {
        // do something
    }
    else if (connection == secondConnection) {
        // do something else
    }
}

Другой немного более объектно-ориентированный вариант - создать два разных объекта-делегата, каждый из которых знает, как работать с каждым типом связи. Затем просто передайте соответствующий делегат при создании каждого соединения. Таким образом, вам не нужно проверять, какое у вас соединение, потому что каждый делегат будет получать connectionDidFinishLoading: только для своего собственного соединения.

12
ответ дан 3 December 2019 в 22:01
поделиться

Я тоже предпочитаю разных делегатов для каждого соединения. Хотя это немного накладные расходы. К счастью, вы можете упростить задачу, используя блоки. Это новая функция, которой пока нет в стандартном SDK, но есть сторонний фреймворк под названием PLBlocks , который вы уже можете использовать. Вот статья о том, как их использовать, она также содержит пример для NSURLConnection.

Это клиентский код, выполняющий HTTP-запрос с обратным вызовом блока:

NSURLRequest *req = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.google.com"]];
[NSURLConnection sendAsynchronousRequest:req onCompletionDo: ^(NSData *data, NSURLResponse *res, NSError *err) {
    NSLog(@"data: %ld bytes. res: %@, error: %@", (long)[data length], res, err);
    [cell.activity stopAnimating];
}];
2
ответ дан 3 December 2019 в 22:01
поделиться

Я также использовал для создания пользовательской оболочки вокруг NSURLConnection , но теперь я переключился на ASIHTTPRequest . Это фантастическая библиотека, обеспечивающая гораздо большую гибкость и возможности, чем NSURLConnection . Посмотрите и попробуйте, оно того стоит.

1
ответ дан 3 December 2019 в 22:01
поделиться

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

Что-то вроде [AsynchronousConnection initWithURL: delegate: selector:

1
ответ дан 3 December 2019 в 22:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: