Finder в Mac OS X 10.6 переписали на Cocoa. Какая разница, на чем он написан, если он остался почти таким же? Большая разница! ОГРОМНЕЙШАЯ.

Я уже писал, что Apple почти не делает «теоретических» фреймворков, которые сама не использует. В Apple пишут программы, под которые делаются фреймворки, которые потом публикуются для сторонних разработчиков. Именно поэтому переписка Finder на Cocoa — это большой подарок программистам.

Так как Finder был написан на Carbon, все серьезные операции с файлами были на карбоновой стороне света. В Cocoa некоторые тоже были, но NSFileManager был настолько медленный, что любой обход директорий приходилось писать с FSRef и сишным API, а то и совсем в BSD уходить. Работа с алиасами и символьными ссылками — опять туда же. Лэйблы (цвета для файлов в Finder), по-моему, то ли совсем нельзя было читать, не залезая в .DS_Store, то ли можно было, но через одно место.

С выходом Snow Leopard наступило счастье. Apple пришлось доработать библиотеки, чтобы написать Finder на Cocoa. Что нового?

  • Унифицирован доступ к файлам. Если раньше это делалось через строку с путем к файлу, через FSRef или NSURL, то теперь нам дали единый и универсальный способ — NSURL.
  • NSFileManager теперь быстро обходит директории.
  • В NSURL появились методы для запроса атрибутов файла: можно получать цвета и названия лэйблов, локализованное имя файла (какое показывается в Finder), даты, размер и иконки, а так же информацию о том, является ли директория бандлом.
  • К предыдущему пункту — если раньше иконки брались через NSWorkspace (но он не выдавал иконки с маленькими стрелочками в левом нижнем углу для алиасов и символьных ссылок), то теперь иконку можно запросить у NSURL (со всеми стрелочками для ссылок!).
  • Появились bookmarks — в них сериализуется NSURL.
  • NSURL теперь может содержать идентификатор файла вместо пути, то есть, URL будет указывать на файл даже если его переименуют или переместят.
  • и еще много всего, о чем можно почитать в Foundation Release Notes.

finder-notfinder.jpg

Я уже попробовал написать «мини Finder» используя только Cocoa. Вместо ковыряния разных API и обзывания Apple нехорошими словами, как это было раньше, я получил много удовольствия. Если каждую новую версию Mac OS X оценивать по количеству строк кода, которых не надо писать разработчикам, то 10.6 вышел отличным релизом.

PS Кстати, видите на картинке дату «Сегодня»? Если раньше это надо было делать вручную, то в Snow Leopard у NSDateFormatter есть опция setDoesRelativeDateFormatting:, которая включает выдачу локализованных «вчера», «сегодня» и даже «позавчера» вместо цифр (и нормальную дату, если ее нельзя выразить словами). Несколько десятков строк кода можно удалять.