некоторые критерии привязывают процессор, используя Scripting Bridge и NSPredicate - PullRequest
1 голос
/ 25 ноября 2011

Я пытаюсь получить список треков из iTunes через Scripting Bridge. Я использую NSPredicate, потому что это рекомендуемый способ . Это работает очень хорошо в некоторых случаях, и необычно медленно в других. Например, это будет выполнено очень быстро:

NSString *formatString = @"artist == ABC AND album == XYZ";
NSPredicate *trackFilter = [NSPredicate predicateWithFormat:formatString];
NSArray *tracksToPlay = [[libraryPlaylist fileTracks] filteredArrayUsingPredicate:trackFilter];

(libraryPlaylist - это объект iTunesLibraryPlaylist, который был создан в другом месте.)

Но если я добавлю либо kind или videoKind к миксу, iTunes достигнет 100% загрузки процессора в течение минуты или более.

NSString *formatString = @"artist == ABC AND album == XYZ AND kind != 'PDF document' AND videoKind == %@", ;
NSPredicate *trackFilter = [NSPredicate predicateWithFormat:formatString, [NSAppleEventDescriptor descriptorWithTypeCode:iTunesEVdKNone]];
NSArray *tracksToPlay = [[libraryPlaylist fileTracks] filteredArrayUsingPredicate:trackFilter];

Но это в конечном итоге сработает. Настоящая ошибка albumArtist. Если я попытаюсь

NSString *formatString = @"albumArtist == ABC AND album == XYZ";
NSPredicate *trackFilter = [NSPredicate predicateWithFormat:formatString];
NSArray *tracksToPlay = [[libraryPlaylist fileTracks] filteredArrayUsingPredicate:trackFilter];

iTunes перейдет на 100% процессор и будет сидеть там, потому что я не знаю, как долго. (Я сдался через 3 или 4 минуты.) Я что-то упустил или это ошибка в iTunes?

Дополнительная информация

Мой код берет полученные дорожки и вызывает другой метод для добавления их в список воспроизведения (также с использованием Scripting Bridge). Я заметил, что при попытке фильтровать по типу, треки будут медленно появляться в списке один за другим, пока iTunes забивает процессор. Это может означать только то, что filteredArrayUsingPredicate уже вернул свои результаты, так над чем так тяжело работает iTunes?

1 Ответ

0 голосов
/ 19 января 2012

Другой пост косвенно помог мне найти ответ.

Использование плейлиста «Библиотека» вызывает ряд необычных проблем. Использование списка воспроизведения «Музыка» вместо этого, кажется, исправляет их. В приведенном выше примере установка libraryPlaylist именно так вызвала проблему:

iTunesApplication *iTunes = [SBApplication applicationWithBundleIdentifier:@"com.apple.iTunes"];
iTunesSource *library = [[[[iTunes sources] get] filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"kind == %i", iTunesESrcLibrary]] objectAtIndex:0];
iTunesLibraryPlaylist *libraryPlaylist = [[[library libraryPlaylists] objectAtIndex:0];

Ответом является получение списка воспроизведения «Музыка» вместо списка воспроизведения «Библиотека»:

iTunesApplication *iTunes = [SBApplication applicationWithBundleIdentifier:@"com.apple.iTunes"];
iTunesSource *library = [[[[iTunes sources] get] filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"kind == %i", iTunesESrcLibrary]] objectAtIndex:0];
iTunesLibraryPlaylist *libraryPlaylist = [[[[library playlists] get] filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"specialKind == %i", iTunesESpKMusic]] objectAtIndex:0];
Другие вещи, о которых нужно знать

Фильтр "albumArtist == ABC AND album == XYZ" в исходном вопросе на самом деле работал довольно быстро. Что медленно, так это то, что вы делаете с результатом позже. Вызов get прямо сейчас является частичным решением. (get работает так же медленно, как и все остальное, но, выполняя это заранее, вы ограничиваете медлительность одной операцией. Также обратите внимание, что get работает только на SBElementArray.)

Я также обнаружил, что вызов fileTracks вновь вводит некоторую медлительность. Использование tracks вместо этого исправляет это. Таким образом, фильтр должен читать:

NSArray *tracksToPlay = [(SBElementArray *)[[libraryPlaylist tracks] filteredArrayUsingPredicate:trackFilter] get];

(При использовании «Библиотеки» только fileTracks вернет объекты со свойством location, которое необходимо добавить в список воспроизведения. После переключения на «Музыка» tracks, кажется, возвращает объекты с расположение.)

...