SPSearch键值观察和阻止

时间:2013-03-30 10:10:29

标签: ios objective-c key-value-observing cocoalibspotify-2.0

我正在开发一种用于播放音乐的跨源解决方案(请参阅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

1 个答案:

答案 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);
}];