Если я напишу фреймворк, который получает информацию из Интернета, я должен сделать degelate или использовать блоки? - PullRequest
0 голосов
/ 15 января 2011

Допустим, я пишу общедоступный фреймворк для Vimeo API.Эта структура должна получать информацию из Интернета.Поскольку это может занять некоторое время, мне нужно использовать threadin, чтобы предотвратить зависание пользовательского интерфейса.Фонд использует делегатов для этого, как NSURLConnectionDelegate.Однако Game Kit использует блоки в качестве функций обратного вызова.

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

Делегаты, с другой стороны, являются реальными методами, и когда используются протоколы,Я уверен, что методы реализованы.

Спасибо.

Ответы [ 5 ]

2 голосов
/ 15 января 2011

Мне действительно нравятся блоки, но в этом случае мне хотелось бы использовать протокол делегирования. Сетевые подключения могут обрываться множеством способов, и их делегаты обычно хранят достаточное количество информации о них. Я считаю, что это хорошо отображается на протокол делегата с несколькими дополнительными методами.

Если вы предоставляете очень упрощенный API для доступа к сетевым данным, пары блоков «успех / отказ» может быть достаточно. Лично я считаю, что мне приходится иметь дело с множеством различных случаев, в которых используется много методов делегата для объекта делегата с состоянием. Например; если я попытаюсь повторить неудачные соединения немедленно или позже, изменится ли относительный приоритет неудачных соединений, могу ли я сделать частичный ответ, если я переключу соединение на wifi, когда оно станет доступным, могу ли я предложить пользователю возможность аутентификации, если будет предложено я показываю прогрессивный прогресс в соединении? Вы можете обработать все это с помощью блоков, но я обнаружил, что предпочел бы иметь класс делегата, управляющий соединением.

Не зная больше о том, какие данные вы собираетесь использовать для своего интерфейса, я не знаю, могу ли я быть более конкретным, но. Я был бы соблазн разрешить пользователям API управлять своим собственным состоянием соединения, если это возможно.

0 голосов
/ 15 января 2011

Я бы порекомендовал использовать блоки, и если вы все сделаете правильно, вы можете одновременно поддерживать 10,5.

Проверьте среду выполнения PLBlocks с открытым исходным кодом , она позволяетбеспрепятственно использовать блоки как на 10,5, так и на 10,6.

0 голосов
/ 15 января 2011

Это довольно субъективный вопрос, поскольку оба являются допустимыми вариантами, но Apple, похоже, все больше смещается в сторону использования блоков для одноразовых методов.

0 голосов
/ 15 января 2011

Главный вопрос - ваша целевая аудитория.

Блок ограничен Snow Leopard (и IOS 4 - не помню).

Если вы хотите, чтобы ваш фреймворк использовался в предыдущих операционных системах, вы не можете использовать блоки.

Если вас устраивают ограничения ОС, тогда используйте блоки и NSOperationQueue, это действительно хорошо и просто в использовании.

Лучше, вы можете предложить оба варианта ..

0 голосов
/ 15 января 2011

Все зависит от вашей целевой аудитории.Если вы хотите, чтобы люди писали приложения для OS X 10.5 или iOS 3.x, вам нужно использовать делегатов.В противном случае, идти вперед и использовать блоки.

...