Единая кодовая база для Snow Leopard и Leopard

Задний план

Я разработчик, который пытается создать приложение для Mac. Я собираюсь достать Snow 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: или чего-то подобного.

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


person John Gallagher    schedule 22.10.2009    source источник


Ответы (2)


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

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

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

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

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

person Louis Gerbarg    schedule 22.10.2009
comment
Спасибо за превосходный ответ, Луис. Я нацелен на веб-разработчиков со своим приложением, и некоторые из моих очень ранних тестировщиков уже используют Snow Leopard, что указывает на то, что мне, возможно, было бы лучше сделать его только Snow Leopard. Однако в настоящее время я работаю на PowerPC Mac, и один из моих тестеров тоже работает на PPC, что несколько усложняет ситуацию. Мне нужно хорошенько подумать о том, куда я пойду дальше. Однако отдельных путей кода определенно нет. Еще раз спасибо за ваш ответ. - person John Gallagher; 22.10.2009

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

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

person Dave DeLong    schedule 22.10.2009
comment
Я наткнулся на PLBlocks, но я не думаю, что попытаться втиснуть это в Leopard возможно. В любом случае, спасибо за предложение! - person John Gallagher; 22.10.2009