1

私は音楽を再生するためのクロスソース ソリューションに取り組んでいます ( Github のプロジェクトを参照)。いわゆる「コンテンツ ソース」にはすべて、検索クエリ ( SMKContentSource プロトコルで定義) によってトラック、アルバム、およびアーティストをフェッチするメソッドがあります。メソッドは非同期で動作し、結果または 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;
            }
        });
    });

loaded残念ですが、SPSearch には値を観察する以外の方法はありません。今、私は他の人がこの実装についてどう思うか、またはより良い解決策のヒントについて尋ねています.


編集: SPSearchインターフェースの設計が悪いと思うので、CocoaLibSpotifyですでに問題を作成しました: https://github.com/spotify/cocoalibspotify/issues/148

4

1 に答える 1