私は音楽を再生するためのクロスソース ソリューションに取り組んでいます ( 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