我正在开发一种用于播放音乐的跨源解决方案(请参阅project on Github)。每个所谓的“内容源”都有通过搜索查询(在SMKContentSource protocol中定义)获取曲目,专辑和艺术家的方法。这些方法异步工作,需要传递一个完成处理程序,它接受一个结果或一个NSError。
目前我正在为Spotify实施内容源。以下代码行已经运行良好,但在我看来这是一个有点风险的解决方案:
SPSession *strongSelf = weakSelf;
dispatch_async([SMKSpotifyContentSource spotifyLocalQueue], ^{
__block SPSearch *search = [[SPSearch alloc] initWithSearchQuery:predicate inSession:strongSelf];
[search addObservationKeyPath:@"loaded" options:0 block:^(MAKVONotification *notification) {
handler(search.albums, nil, nil);
[search removeAllObservers];
search = nil;
}];
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(SMKSpotifyDefaultLoadingTimeout * NSEC_PER_SEC));
dispatch_after(popTime, [SMKSpotifyContentSource spotifyLocalQueue], ^{
if (search) {
handler(nil, nil, [NSError errorWithDomain:SMKSpotifyErrorDomain code:SMKSpotifyLoadingTimeoutErrorCode userInfo:nil]);
[search removeAllObservers];
search = nil;
}
});
});
很遗憾,但是SPSearch没有提供任何其他方式来观察loaded
值。
现在我问的是其他人对这个实现的看法或者更好的解决方案的提示。
编辑:我还在CocoaLibSpotify上创建了一个问题,因为我认为SPSearch界面设计不合理:https://github.com/spotify/cocoalibspotify/issues/148
答案 0 :(得分:0)
在向CocoaLibSpotify发布之后,他们告诉我,我已经在他们的文档中监督了一些帮助类,这是为这类问题而设计的。
正确的解决方案是使用SPAsyncLoading
:
NSArray *someTracks = …; // Some tracks.
[SPAsyncLoading waitUntilLoaded:someTracks timeout:10.0 then:^(NSArray *loadedTracks, NSArray *notLoadedTracks) {
NSLog(@"The following tracks are loaded: %@", loadedTracks);
}];