【问题标题】:SPSearch key-value-observing and blocksSPSearch 键值观察和块
【发布时间】: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


【解决方案1】:

在将其发布给 CocoaLibSpotify 后,他们告诉我,我已经在他们的文档中监督了一些专门针对此类问题而设计的帮助程序类。

正确的解决方案是使用SPAsyncLoading:

NSArray *someTracks = …; // Some tracks.

[SPAsyncLoading waitUntilLoaded:someTracks timeout:10.0 then:^(NSArray *loadedTracks, NSArray *notLoadedTracks) {
    NSLog(@"The following tracks are loaded: %@", loadedTracks);
}];

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-29
相关资源
最近更新 更多