Вопрос

Предыстория

Я разработчик, который находится в процессе создания приложения для Mac.Я вот-вот доберусь до Снежного Барса.До сих пор я опирался на Leopard.Я занимаюсь разработкой Cocoa всего около года, не очень интенсивно.

Я много читал о Snow Leopard и, в частности, о Grand Central Dispatch.Я знаю, что он использует блоки, но я не вникал в подробности того, как работают блоки или как работает Grand Central Dispatch.

Мой Вопрос

Как мне наилучшим образом разработать одну базу кода как для Snow Leopard, так и для Leopard, максимально используя преимущества новой многопоточности в Snow Leopard?

NSOperationQueue - очередь операций

Инстинкт подсказывает мне не иметь дело с GCD непосредственно в моем коде, но когда что-то нужно ставить в очередь, используйте NSOperationQueue, поскольку я читал на сессиях вопросов и ответов Майка Эша, что в Snow Leopard NSOperationQueue в полной мере использует преимущества GCD, а ошибка, которую он обнаружил в Leopard, теперь исправлена.

Ручное Управление потоками

Однако, когда дело доходит до управления конкретными фоновыми потоками, есть ли какой-нибудь способ воспользоваться преимуществами более простого в использовании управления потоками в Snow Leopard, не нарушая работу в Leopard?Или люди порекомендовали бы мне иметь разные цели для каждой операционной системы с несколькими разными классами в каждой?Мне это показалось бы кошмаром технического обслуживания, который только и ждет своего часа.

Или, может быть, мне просто следует смириться с тем, что мое приложение не было полностью оптимизировано для Snow Leopard, и придерживаться +(void)detachNewThreadSelector:toTarget:withObject: или что-то подобное.

Что думают люди?

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

Решение

Ваше внутреннее впечатление о GCD верное.Фактически, любой API, использующий блоки, недоступен, если только вы не обусловите выполнение этого кода только на Snow Leopard.Это имеет смысл, если код предназначен для поддержки функций, доступных только в Snow Leopard, но если это функция, которую вы также собираетесь поддерживать в Leopard, вы могли бы с таким же успехом просто использовать путь к коду Leopard во всех случаях, добавив специфичный для Snow Leopard путь, который не обеспечивает каких-либо видимых улучшений для пользователя, просто усложнит ваш код и увеличит затраты на тестирование.

Это особенно относится к таким вещам, как управление потоками или GCD.Изменения там требуют значительной перестройки архитектуры, это не просто:

if (snowLeopard) {
  [NSSnazySnowLeopardClass doSomething];
} else {
  [NSBoringLeopardClass doSomethingEquivalent];
}

В общем, если изменения настолько просты, Apple обрабатывает их внутри класса без изменения API.Другими словами, вопрос не в том, можете ли вы использовать более простой код управления потоками в Snow Leopard, а в том, зачем вам это делать, если вам все равно понадобится сделать жесткую версию для Leopard.Дополнительный путь к коду - это дополнительный путь к коду, и до тех пор, пока вы не сможете отказаться от поддержки Leopard, использование существенно отличающихся API в Snow Leopard (даже если они проще в использовании, чем Leopard) - это просто дополнительная работа.

Я бы подумал о том, действительно ли вы хотите нацелиться на Leopard.Внедрение Snow Leopard было справедливым, Snow Leopard - дешевое обновление, и из-за изменений в API на пользователей будет оказываться большое давление со стороны небольших разработчиков, создающих приложения только для Snow Leopard.Единственная группа пользователей, которые собираются надолго остаться на Leopard, - это те, кто технически не подкован (кто вряд ли установит много программного обеспечения сторонних производителей), и те, кто все еще использует PPC Mac (кто не покупал новый Mac в течение 3 лет, поэтому, вероятно, не покупает много программного обеспечения).Если вы думаете, что это приложение поступит в продажу через 3-9 месяцев, я бы сказал, что переход только на Snow Leopard, вероятно, является разумным вариантом и значительно сократит ваши затраты на разработку и тестирование.

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

Одним из способов было бы понять, какие API в Leopard были изменены в Snow Leopard для использования GCD.Например, NSOperation и NSOperationQueue в Leopard работают так же, как и всегда.Однако в Snow Leopard они были переписаны, чтобы использовать преимущества GCD под ними.Вуаля.Мгновенное обновление для ваших пользователей 10.6.

Другим вариантом было бы использовать что-то вроде Блоки PLBlocks и скомпилируйте GCD в свой код самостоятельно.Я понятия не имею, сработает ли это, но, возможно, попробовать стоит.=)

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