Делегирование работы двум различным делегатам, возможно ли это? - PullRequest
3 голосов
/ 01 ноября 2011

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

[request setDownloadProgressDelegate:progressIndicator];

Я хочу показать % рядом с моим индикатором выполнения, чтобы пользователь знал, какой процент был загружен. Примерно так (я сделал это в фотошопе):

mockup of desired UI

<ч />

Я подумал о том, чтобы использовать

- (void)request:(ASIHTTPRequest *)request didReceiveBytes:(long long)bytes;

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

Но чтобы вызвать этот метод, я должен реализовать его в своем классе, а затем setDownloadProgressDelegate до self, например,

[request setDownloadProgressDelegate:self];

Следовательно, можно ли сделать так, чтобы у объекта request было два разных делегата одновременно, чтобы я мог получать ответы с обоими? Мне просто нужно кое-что вычислить, чтобы рассчитать процент и обновить мой UILabel - я знаю точный размер загружаемого файла.

Ответы [ 3 ]

3 голосов
/ 01 ноября 2011

Вы хотите использовать NSNotificationCenter. Это позволяет вам свободно соединять объекты, используя модель pub / sub. Вы можете опубликовать Уведомление от объекта, и любое произвольное число объектов может получить информацию без тесной связи делегатов.

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nsnotificationcenter_Class/Reference/Reference.html

2 голосов
/ 02 ноября 2011

После нескольких часов чтения я, наконец, нашел самый простой способ решения этой проблемы, ASIHTTPRequest имеет два различных метода, которые могут помочь установить делегатов.

  1. Для индикатора просмотра прогресса. - Это обновляет представление Progress с коротким шагом.
  2. Для класса сам. - И это позволяет добавить метод в класс, который вызывается объектом ASIHTTPRequest, когда он завершает загрузку или выгрузку.

Итак, я установил делегат представления прогресса, а затем установил себя как делегат объекта запроса. как,

[request setDownloadProgressDelegate:myProgressViewObject]; // For progress view increment
[request setDelegate:self]; // For adding methods such as finished downloading started downloading.
<ч />

Цель Mt состояла в том, чтобы мой объект запроса вызвал метод ниже,

- (void)request:(ASIHTTPRequest *)request didReceiveBytes:(long long)bytes; // Now I can increment my UILabel percentage here.

Который периодически обменивается сообщениями,

[request setDelegate:self]; 

Надеюсь, это поможет другим в будущем!

Приветствия

2 голосов
/ 01 ноября 2011

Любой объект может иметь более одного делегата, вам просто нужно следить за ним.Таким образом, у вас может быть два отдельных протокола для двух разных сценариев и две id переменные для каждого делегата.Это похоже на то, что UITableView делает со своим делегатом и источником данных, которые могут быть двумя разными объектами.

...