2013-08-05 2 views
1

Я наткнулся на проблему в своем приложении, где диспетчеру просмотра музыкального плеера нужно сохранить делегата (который является облачным хранилищем с песнями), чтобы сохранить плейлист песни до тех пор, пока не будет выбрана песня из новой папки.Хорошо ли сохранить делегат?

Итак, когда пользователь удаляет песню в какой-либо папке, я назначаю делегат этому ViewController, поэтому, даже когда он выталкивается из представления, он остается в памяти, чтобы музыкальный проигрыватель мог воспроизводить следующие и предыдущие песни. Но когда пользователь выбирает песню из другой папки (ViewController), я устанавливаю делегат музыкального проигрывателя на нуль и назначаю делегат этому новому ViewController.

Является ли это решение приемлемым?

Код:

MusicPlayerViewController имеет:

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

View Controller, в котором будут загружены песни из папки хранения облако это называется при постукивании по ячейке (песня):

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

ответ

2

Нет фундаментальной проблемы с удержанием (держащей ссылку) делегата. Это необычно, но не беспрецедентно. NSURLConnection. Он создает цикл сохранения, который может быть очень полезным при правильном управлении. Это зависит только от вас, чтобы убедиться, что объект будет делить свой делегат детерминированным образом, так что цикл сохранения будет нарушен.

BUT ... конкретный случай, который вы обсуждаете здесь, звучит так, как будто у вас проблема с MVC, и что ваш контроллер просмотра делает что-то, чего не должно быть.

Я назначаю делегата этому ViewController, поэтому даже когда он выталкивается из представления, он остается в памяти, чтобы музыкальный проигрыватель мог воспроизводить следующие и предыдущие песни.

Если вы говорите, что не можете воспроизводить музыку, если в памяти нет определенного контроллера вида, возможно, у контроллера вида есть неправильная ответственность. Контроллер представления должен управлять представлением. Это должно быть независимо от того, на самом деле играет музыка. См. https://stackoverflow.com/a/5228317/97337 для обсуждения того, как музыкальная система может быть разбита в MVC.

+0

Благодарим за консультацию, что ViewController, находящийся в памяти, является DropboxViewController, который извлекает данные из хранилища Dropbox и создает потоковые ссылки для проигрывателя, поэтому мне сложно создать некоторый интеллектуальный шаблон MVC, есть ли у вас какие-то идеи может быть? – vburojevic

+0

Если они спроектировали контроллер своего вида для управления собственным сетевым трафиком, это несчастливо. Там может быть не так много, чтобы это исправить. Они должны иметь 'DropboxController', который отделен от контроллера вида. –

0

В примере, который вы предлагаете, делегат должен быть на самом деле слабым, учитывая, что музыкальный проигрыватель остается одним и тем же экземпляром, и контроллер просмотра получает/отменяет что-то другое.

Если делегат был сильным, ваш Viewcontroller не будет выпущен, если Musicplayer не будет освобожден, и в большинстве случаев Viewcontroller должен быть освобожден, когда его вид больше не используется. Как сказал Роб, у вас, похоже, есть проблема MVC.

Смежные вопросы