Асинхронное NSUrlConnection не на главном цикле выполнения - PullRequest
1 голос
/ 03 февраля 2012

Я создаю набор классов, которые взаимодействуют с веб-сервисом.В основе этого данные извлекаются из службы с использованием асинхронного NSUrlConnection.На мой взгляд, важно, чтобы он был асинхронным, поскольку клиент этих интерфейсов веб-службы должен иметь возможность отменить текущий запрос (т. Е. Отменить NSUrlConnection).

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

Асинхронные вызовы все в порядке, но у меня возникают проблемы с асинхронным запуском NSUrlConnection в цикле выполнения, который не является основным.Проблема, которую я описываю, кажется, довольно хорошо задокументирована: меня убеждают, что делегат NSUrlConnection не вызывается, потому что runloop, запускающий соединение, завершен, и, следовательно, вызовы к делегату не могут быть запланированы на его runloop.

Как лучше всего решить эту проблему?

Я пытался использовать:

   while (!self.isRequestComplete && !self.isRequestCancelled)
        [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
    }

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

Будет ли вариант предлагать асинхронные вызовы клиентам, а затем использоватьВыше метод, если опция используется?Есть ли лучший способ добиться того, что я пытаюсь сделать?

Я стремлюсь достичь пакета классов, которые позволяют взаимодействовать с моим конкретным веб-сервисом, где клиенты моего кода не нуждаютсябеспокоиться о том, будут ли их собственные делегаты (на которые мои классы содержат ссылки) вызываться в разных потоках.Я хочу, чтобы они вызывались в том же цикле выполнения, в котором они вызывали мой код - в основном, именно так работает NSUrlConnection!

Заранее спасибо!Ник

1 Ответ

0 голосов
/ 03 февраля 2012

Я думаю, что вы, возможно, «пошли не по тому руслу», так сказать.Вообще говоря, вам не нужно беспокоиться о циклах выполнения, если вы не делаете что-то довольно странное.Похоже, вам нужно почитать о многопоточности, особенно Grand Central Dispatch.

...