1

新しいフォルダーの曲が選択されるまで、曲のプレイリストを保持するために、音楽プレーヤー ビュー コントローラーがデリゲート (曲を含むクラウド ベースのストレージ) を保持する必要があるアプリケーションの問題に遭遇しました。

そのため、ユーザーがフォルダー内の曲をタップすると、デリゲートをその ViewController に割り当てて、デリゲートがビューからプッシュされた場合でもメモリ内にとどまり、音楽プレーヤーが次の曲と前の曲を再生できるようにします。しかし、ユーザーが別のフォルダー (ViewController) から曲を選択すると、音楽プレーヤーのデリゲートを nil に設定し、デリゲートをその新しい ViewController に割り当てます。

この解決策は受け入れられますか?

コード:

MusicPlayerViewController には次のものがあります。

@property (nonatomic, strong) id <MusicPlayerViewDelegate> delegate;

曲をクラウド ストレージ フォルダーからロードするビュー コントローラーでは、セル (曲) をタップすると次のように呼び出されます。

musicPlayerViewController.delegate = nil;
musicPlayerViewController.delegate = self;
4

2 に答える 2

2

デリゲートを保持する (強い参照を保持する) ことに基本的な問題はありません。珍しいことではありますが、前例のないことではありません。NSURLConnectionそれをします。正しく管理されていれば非常に役立つ保持ループが作成されます。保持ループが壊れるように、オブジェクトが決定論的な方法でデリゲートを解放することを確認するのはあなた次第です。

しかし...ここで議論している特定のケースは、MVCの問題があり、View Controllerがすべきではないことをしているように聞こえます。

デリゲートをその ViewController に割り当てて、ビューからプッシュされた場合でもメモリ内にとどまり、音楽プレーヤーが次の曲と前の曲を再生できるようにします。

特定のビュー コントローラーがメモリ内にないと音楽を再生できないと言っている場合は、ビュー コントローラーの責任が間違っている可能性があります。ビューコントローラーはビューを管理する必要があります。それは実際に音楽を演奏することとは無関係であるべきです。MVC で音楽再生システムがどのように分割されるかについては、https://stackoverflow.com/a/5228317/97337を参照してください。

于 2013-08-05T20:07:00.263 に答える