Мост сценариев и фильтрация SBElementArrays с использованием NSPredicate и FourCharCodes - PullRequest
4 голосов
/ 03 января 2011

Я экспериментирую с Scripting Bridge впервые, но столкнулся с проблемой фильтрации SBElementArray по NSP-предикату, содержащему в качестве критерия перечисляемую константу FourCharCode.

Я написалтривиальная программа для определения «библиотечного» источника в пользовательской библиотеке iTunes с помощью -filteredArrayUsingPredicate: для фильтрации SBElementArray всех источников iTunes.Я ожидал получить обратно SBElementArray, который при оценке даст массив из одного элемента, а именно из источника библиотеки.Вместо этого, когда я вызываю -get для возвращенного SBElementArray, я получаю обратно пустой массив.

Смущает, если меняет порядок и вместо этого вызывает -get для SBElementArray всех источников, чтобы получитьконкретный NSArray и вызов -filteredArrayUsingPredicate: для этого массива с тем же предикатом, что и раньше, я получаю желаемый результат.Однако я не думаю, что это необходимо, и я успешно отфильтровал SBElementArray с использованием других NSP-предикатов (например, @"name=='Library'" работает нормально).

Фрагмент кода приведен ниже.iTunesESrcLibrary - это константа FourCharCode, определенная в заголовочном файле, сгенерированном Scripting Bridge.(iTunesESrcLibrary = 'kLib').У меня работает 10.6.5.

iTunesApplication* iTunes = [[SBApplication alloc] initWithBundleIdentifier:@"com.apple.iTunes"];   

NSPredicate* libraryPredicate = [NSPredicate predicateWithFormat:@"kind == %u", iTunesESrcLibrary];

SBElementArray* allSources_Attempt1 = [iTunes sources];
SBElementArray* allLibrarySources_Attempt1 = (SBElementArray*)[allSources_Attempt1 filteredArrayUsingPredicate:libraryPredicate];

NSLog(@"Attempt 1: %@", allLibrarySources_Attempt1);
NSLog(@"Attempt 1 (evaluated): %@", [allLibrarySources_Attempt1 get]);


NSArray* allSources_Attempt2 = [[iTunes sources] get];
NSArray* allLibrarySources_Attempt2 = [allSources_Attempt2 filteredArrayUsingPredicate:libraryPredicate];

NSLog(@"Attempt 2: %@", allLibrarySources_Attempt2);

Вывод, который я получаю, следующий:

Attempt 1: <SBElementArray @0x3091010: ITunesSource whose 'cmpd'{ 'relo':'=   ', 'obj1':'obj '{ 'want':'prop', 'from':'exmn'($$), 'form':'prop', 'seld':'pKnd' }, 'obj2':1800169826 } of application "iTunes" (88827)>
Attempt 1 (evaluated): (
)
Attempt 2: (
"<ITunesSource @0x3091f10: ITunesSource id 65 of application \"iTunes\" (88827)>"
)

1 Ответ

5 голосов
/ 03 января 2011

Я думаю, я понял это.Кажется, вы не можете просто использовать целочисленное значение FourCharCode непосредственно в NSPredicate, которое вы намерены использовать для фильтрации SBElementArray.

. Случайно я обнаружил, что вместо:

[NSPredicate predicateWithFormat:@"kind == %u", iTunesESrcLibrary]

вам нужно использовать:

[NSPredicate predicateWithFormat:@"kind == %@", [NSAppleEventDescriptor descriptorWithTypeCode: iTunesESrcLibrary]]

Используя эту вторую форму, я могу отфильтровать список источников SBElementArray, как и ожидалось.Однако этот новый предикат нельзя использовать для фильтрации NSArray, хотя этот массив является только оценочной формой SBElementArray!Здесь вы должны вернуться к версии %u.

Rant:
Честно говоря, это отстой, и, похоже, с такими вещами должен работать Мост Сценариев, поэтому мне не нужно;Я не должен был знать, что такое NSAppleEventDescriptor.И хотя разумно, что не все предикаты, которые работают с NSArray, должны работать с SBElementArray, обратное не должно иметь место, и это излишне запутывает, что это так.

...