【问题标题】:Multiple NSURLConnection delegates in Objective-CObjective-C 中的多个 NSURLConnection 委托
【发布时间】:2010-09-17 05:26:47
【问题描述】:

我有两个 NSURLConnections。第二个取决于第一个的内容,因此对于两个连接,处理从连接接收到的数据将是不同的。

我刚刚开始学习 Objective-C,我想知道实现委托的正确方法是什么。

我现在正在使用:

NSURL *url=[NSURL URLWithString:feedURL];
NSURLRequest *urlR=[[[NSURLRequest alloc] initWithURL:url] autorelease];
NSURLConnection *conn=[[NSURLConnection alloc] initWithRequest:urlR delegate:self];

我不想使用 self 作为委托,如何定义两个不同委托的连接?

NSURLConnection *c1 = [[NSURLConnection alloc] initWithRequest:url delegate:handle1];
NSURLConnection *c2 = [[NSURLConnection alloc] initWithRequest:url delegate:handle2];

如何创建 handle1 和 handle2 作为实现?还是接口?我真的不明白你会怎么做。

任何帮助都会很棒。

谢谢, 布赖恩·詹福卡罗

【问题讨论】:

    标签: ios objective-c macos cocoa


    【解决方案1】:

    Ben,虽然您的信息很有帮助,但它并没有完全回答我提出的问题。

    我终于想出了如何设置我自己的代表,这正是我真正想要的。

    我是这样实现的:

    @interface DownloadDelegate : NSObject 
    - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;
    - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;
    @end
    
    @implementation DownloadDelegate
    - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    }
    - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    }
    @end
    

    我们像这样使用委托:

    DownloadDelegate *dd = [DownloadDelegate alloc];
    NSURLConnection *c2 = [[NSURLConnection alloc] initWithRequest:url delegate:dd];
    

    希望对处于相同位置的任何人有所帮助,再次感谢 Ben 的帮助。

    谢谢,

    布赖恩·詹福卡罗

    【讨论】:

    • 很好的答案。正是我想要的。感谢您花时间回答您自己的问题
    【解决方案2】:

    我认为以干净的方式处理多个连接的最佳方法是保留一个委托,并仅使用标签标识每个 NSURLConnection(这是一个非常简单的子类,您可以阅读并从 http://www.isignmeout.com/multiple-nsurlconnections-viewcontroller/ 复制)

    基本上用一个识别标签来初始化每个 NSURLConnection,然后你可以在委托中拉那个标签,并根据你需要的任何逻辑使用 Switch-Case 处理它。

    更新

    我已经把子类化的 NSURLConnection 变成了一个简单的 Category - 更简单更干净一些

    https://github.com/Shein/Categories

    【讨论】:

      【解决方案3】:

      在您的示例中,您分配了一个 DownloadDelegate 对象,而无需对其进行初始化。

          DownloadDelegate *dd = [DownloadDelegate alloc];
      

      这很危险。而是:

          DownloadDelegate *dd = [[DownloadDelegate alloc] init];
      

      此外,严格没有必要在 @interface 声明中声明您的委托响应方法(当然这不会有什么坏处)。最后,你需要确保你实现了 connection:didFailWithError: 和 connectionDidFinishLoading: 来释放你的 DownloadDelegate 对象,否则你会泄漏。

      很高兴你已经开始运行了!

      【讨论】:

        【解决方案4】:

        委托被实现为标准的 NSObject-descended 对象。

        您可以将两个连接指向同一个委托。

        委托应该实现您想要捕获的 NSURLConnectionDelegate 方法(例如 -connection:didReceiveData: 和 -connectionDidFinishLoading:)。这些方法将由代理酌情调用。

        【讨论】:

          【解决方案5】:

          http://github.com/leonho/iphone-libs/tree/master 尝试我的 MultipleDownload 类,它会为您处理多个 NSURLConnection 对象。

          【讨论】:

            【解决方案6】:

            由于委托是异步调用的,它们可以按随机顺序调用 didfinishloading。然后,您可以使用状态检查来确定“其他”下载是否已完成,然后再继续。

            我使用 2 个代表:

            例如(这是伪oc):

            jsondelegate = [[JSonDelegate alloc]initWithCaller:self andSelector:@selector(jsonDone:)]
            otherdelegate = [[OtherDelegate] initWithCaller:self andSelector:@selector(otherDone:)]
            

            当每个委托完成时,委托通过调用 2 个 done 方法通知调用者。

            每个 done 方法接收 url 数据,并将其状态保存到 ivar。然后他们检查是否设置了另一个 ivar,如果它们都完成了,则继续处理。

            if(self.jsonString && self.otherData){
              continueProcessing
            }
            

            希望这会有所帮助。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2023-04-11
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多