【发布时间】:2013-03-30 10:10:29
【问题描述】:
我正在研究用于播放音乐的跨源解决方案(请参阅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
【问题讨论】:
-
我不明白
search被注释__block的目的,因此您可以在块的末尾将其设置为nil。另外 - 此代码是否在另一个未显示的块内?编辑:我知道你现在想通过将search设置为nil来做什么。这看起来有点危险。 -
@CarlVeazey:是的,我知道。这就是为什么我要求更好的解决方案。
标签: ios objective-c key-value-observing cocoalibspotify-2.0