编辑:用我几个月后想出的答案更新我自己的问题。简答为否,MPMusicPlayerController
转发对主线程的所有调用。但它使用CPDistributedMessagingCenter
来实际处理所有操作,因此可以非常轻松地编写一个替换控制器来进行异步调用(但据我所知,它不适用于沙盒App Store应用程序 - 如果它确实如此,Apple会立即拒绝它。)
我正在制作一个简单的应用程序来控制iPod播放,所以我一直在使用MPMusicPlayerController
,Apple状态只能在主线程中使用。但是,我在UI中遇到了一些令人沮丧的性能问题。通过滑动触发切换到下一首或上一首歌曲,其用它移动整个显示(歌曲信息),然后在触发开关时更新下一首歌曲的显示。麻烦的是,一旦歌曲被更改,UI就会挂起一秒钟,同时从MPMusicPlayerController
中检索歌曲信息。我已经尝试了大多数我能想到的优化代码,但在我看来,修复它的唯一方法是将MPMusicPlayerController
代码移到后台线程,尽管Apple没有指示。< / p>
更新显示的代码,供参考:
// Called when MPMusicPlayerControllerNowPlayingItemDidChangeNotification is received
- (void) nowPlayingDidChange {
if ([iPodMusicPlayer nowPlayingItem]) {
// Temp variables (necessary when updating the subview values in the background)
title = [[iPodMusicPlayer nowPlayingItem] valueForProperty:MPMediaItemPropertyTitle];
artist = [[iPodMusicPlayer nowPlayingItem] valueForProperty:MPMediaItemPropertyArtist];
album = [[iPodMusicPlayer nowPlayingItem] valueForProperty:MPMediaItemPropertyAlbumTitle];
artwork = [[[iPodMusicPlayer nowPlayingItem] valueForProperty:MPMediaItemPropertyArtwork] imageWithSize:CGSizeMake(VIEW_HEIGHT - (2*MARGINS), VIEW_HEIGHT - (2*MARGINS))];
length = [[[iPodMusicPlayer nowPlayingItem] valueForProperty:MPMediaItemPropertyPlaybackDuration] doubleValue];
if (updateViewInBackground)
[self performSelectorInBackground:@selector(updateSongInfo) withObject:nil];
else
[self updateSongInfo];
}
else
[self setSongInfoAsDefault];
}
- (void) updateSongInfo {
// Subviews of the UIScrollView that has performance issues
songTitle.text = title;
songArtist.text = artist;
songAlbum.text = album;
songLength.text = [self formatSongLength:length];
if (!artwork) {
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)] && [[UIScreen mainScreen] scale] == 2.00)
songArtwork.image = [UIImage imageWithContentsOfFile:
@"/System/Library/Frameworks/MediaPlayer.framework/noartplaceholder@2x.png"];
else
songArtwork.image = [UIImage imageWithContentsOfFile:
@"/System/Library/Frameworks/MediaPlayer.framework/noartplaceholder.png"];
}
else
songArtwork.image = artwork;
title = nil;
artist = nil;
album = nil;
artwork = nil;
length = 0.0;
}
这里是否有任何遗漏(即更新UIScrollView
子视图时的性能优化)?如果没有,那么在后台线程中使用MPMusicPlayerController
会是一个坏主意吗?我知道如果有其他东西正在访问iPodMusicPlayer
(MPMusicPlayerController
中的iPod的共享实例),可能会导致问题,但有什么办法可以解决这个问题吗?
此外,这是一个越狱调整(通知中心小部件),所以我可以利用Apple的私有框架,如果它们比MPMusicPlayerController
类(相对来说相当有限)更好地工作我的目的。但这也意味着我的应用程序将作为SpringBoard进程的一部分运行,所以我想确保我的代码尽可能安全和稳定(每当我的代码出错时我经历2分钟挂起,当我发布这个时,我不想发生这种情况)。所以,如果您有任何建议,我真的很感激!如有必要,我可以提供更多代码/信息。谢谢!