【发布时间】:2010-12-21 12:41:18
【问题描述】:
我有一个封装了一些网络服务功能的 NSOperation。 NSOperation 有一个委托,该委托将在操作结束时收到消息。
由于 NSOperation 存在于不同的线程上,我必须像这样进行调用:
[delegate performSelectorOnMainThread:@selector(getDealersIDSuccess:) withObject:result waitUntilDone:YES];
它工作得很好,但它给了我一个警告:
警告: '-performSelectorOnMainThread:withObject:waitUntilDone:' 在协议中找不到
我完全同意这个编译器,它看到了一个委托,它检查了协议,它没有发现 performSelector 方法的声明。
我的问题是:我可以通过以不同的方式进行此调用来消除警告吗?
我的两个猜测是我可以 (1) 编写一个名为
的方法- (void) callDelegateMethodOnMainThred {
[delegate getDealersIDSuccess:result]
}
并通过 performSelectorOnMainThread 调用它,但我发现该解决方案很麻烦,而且在委托之上需要额外的、难以阅读的步骤。
第二种解决方案可能是将委托转换为选择器内我的父对象的类型,但这简直太疯狂了,并且违背了委托封装模式。
我非常感谢对语言有更好理解的人提供的第三种解决方案:)
提前谢谢你。
编辑:添加委托声明:
id <ISDealersIDDelegate> delegate;
我将我的代表声明为 id。它自己扩展 UIViewController 的委托。
我可以看到将其声明为 NSObject 会起作用。
【问题讨论】:
-
你的委托是如何声明的?
-
所有 NSObjects 都应该响应 performSelectorOnMainThread:... 你的委托/你如何声明它/等等有问题...我们可以看看更多的代码吗?
标签: iphone objective-c