【问题标题】:Best Practice: When to use a delegate or not? NSXMLParserDelegate vrs NSURLConnection最佳实践:何时使用委托? NSXMLParser 委托与 NSURLConnection
【发布时间】:2011-09-27 02:04:13
【问题描述】:

我正在实现一个简单的 Twitter 客户端作为学习示例。

我的控制器通过一系列事件/回调的自定义实现来实现 NSXMLParserDelegate。同样,我为 NSURLConnection 实现了一系列回调。我不明白为什么前者是代表而后者不是。感觉两者都是事件处理程序类,并且可以很容易地成为委托。我已经阅读了msdn 上的最佳实践,并且认为两者都将作为代表实施。我在这里想念什么?真的很重要吗?

 @interface SimpleTwitterClientViewController : UIViewController <NSXMLParserDelegate> {

     // Event handlers/callbacks for NSXMLParser Delegate
     - (void)parserDidStartDocument:(NSXMLParser *)parser;
     - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName
    namespaceURI:(NSString *)namespaceURI
    qualifiedName:(NSString *)qualifiedName
    attributes:(NSDictionary *)attributeDict;
     - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
    namespaceURI:(NSString *)namespaceURI
    qualifiedName:(NSString *)qName;
     - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string;
     - (void)parserDidEndDocument:(NSXMLParser *)parser;

     // Event handlers/callbacks for URL Connection
     - (void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;
     - (void) connection:(NSURLConnection *)connection didFailWithError: (NSError *)error;
     - (void) connectionDidFinishLoading: (NSURLConnection*) connection;
}

【问题讨论】:

    标签: ios delegates


    【解决方案1】:

    两个都实现为委托。您正在查看代码并通过名称猜测它是什么,而不是阅读 Apple 文档。当您看到&lt;SomeNameHere&gt; 时,即为protocol。委托符合它,这就是协议被命名为SomethingDelegate 的原因。之所以不这么称呼它,是因为它是一个委托。

    NSURLConnection 对其委托使用非正式协议而不是正式协议。所有这一切的真正含义是,当您将对象用作委托时,系统会接受您的话,而不是检查自己是否实现了相关方法。我不知道为什么会出现这种情况的任何特殊原因。自己实现委托系统时最好使用正式协议,但这不是必须的。

    不必费心阅读 MSDN 上的任何文档。这适用于 C#,而不是 Objective C。请阅读 Apple 开发者中心的文档。

    【讨论】:

    • Tx 吉姆。我认为代表的概念是相同的,我只是反映了我在 stackoverflow 上的其他帖子中看到的内容。我应该添加iOS docs here。我不明白的是需要在接口中实现一个委托而不是另一个。我没有收到 URL 类的任何编译器警告。如此非正式与正式......嗯
    • 这些方法都不需要在头文件中列出,具有委托的对象永远不会看到您的接口,它们在您之前编译并告诉您接口会做什么是 - - - 当你声明你遵守 &lt;FooProtocol&gt; 告诉编译器在实现中期望该协议的 @required 方法时
    • tx,我实际上并没有在头文件中包含它们,我只是认为这是显示正在发生的事情的最简单方法。我很高兴我问了这个问题。我学到了很多。 Tx Jim 和 bshirley。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多