将工作委托给两个不同的代表,是否可能?

时间:2011-11-01 01:44:41

标签: objective-c ios cocoa-touch delegates asihttprequest

我正在尝试使用UIProgressView从服务器下载图像时显示ASIHTTPRequest。我想在使用此代码完美运行的UIProgressView上显示进度:

[request setDownloadProgressDelegate:progressIndicator];

我想在进度条旁边显示%,以便用户知道已下载的百分比。像这样的事情(我在Photoshop中做了这个):

mockup of desired UI


我想到的是使用

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

更新我的UILabel,当ASI请求收到一定数量的字节时,总是调用此方法。

但要调用此方法,我必须在我的课程中实现它,然后setDownloadProgressDelegateself,就像这样,

[request setDownloadProgressDelegate:self];

因此,我可以让request对象同时拥有两个不同的代理,所以我可以同时收到回复吗?我只需要做一些数学来计算百分比并更新我的UILabel - 我知道我正在下载的文件的确切大小。

3 个答案:

答案 0 :(得分:3)

您想使用NSNotificationCenter。这允许您使用pub / sub模型松散地耦合对象。您可以从对象发布通知,任何数量的对象都可以获取信息,而无需委托的紧密耦合。

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

答案 1 :(得分:2)

任何对象都可以有多个委托,您只需跟踪它们即可。因此,您可以针对两种不同的方案使用两个单独的协议,并为每个委托提供两个id个变量。这类似于UITableView对其委托和数据源的作用,它可以是两个不同的对象。

答案 2 :(得分:2)

经过几个小时的阅读后,我终于找到了解决这个问题的最简单方法,ASIHTTPRequest有两种不同的方法可以帮助设置代理。

  1. 用于进度视图指示器。 - 这会以短的增量更新进度视图。
  2. 上课自我。 - 这允许在类中添加方法,该方法在完成下载或上传时由ASIHTTPRequest对象调用。
  3. 所以我做的是设置进度视图委托,而不是将自己设置为请求对象的委托。等,

    [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]; 
    

    希望这将有助于其他人!

    干杯