Другой пост косвенно помог мне найти ответ.
Использование плейлиста «Библиотека» вызывает ряд необычных проблем. Использование списка воспроизведения «Музыка» вместо этого, кажется, исправляет их. В приведенном выше примере установка 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
, кажется, возвращает объекты с расположение.)