- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个 NSOperation 包装了一些网络服务功能。 NSOperation 有一个委托(delegate),当操作结束时会收到消息。
由于 NSOperation 位于不同的线程上,我必须这样调用:
[delegate performSelectorOnMainThread:@selector(getDealersIDSuccess:) withObject:result waitUntilDone:YES];
它工作得很好,但它给了我一个警告:
warning: '-performSelectorOnMainThread:withObject:waitUntilDone:' not found in protocol(s)
在这一点上我完全同意编译器,它看到一个委托(delegate),它检查协议(protocol),它发现没有 performSelector 方法的声明。
我的问题是:我可以通过以不同方式进行调用来移除警告吗?
我的两个猜测是我可以 (1) 编写一个名为
的方法- (void) callDelegateMethodOnMainThred {
[delegate getDealersIDSuccess:result]
}
并通过 performSelectorOnMainThread 调用它,但我发现该解决方案很麻烦,而且在委托(delegate)之上还有一个额外的、难以阅读的步骤。
第二个解决方案可能是将委托(delegate)转换为选择器内我的父对象的类型,但这简直太疯狂了,并且违背了委托(delegate)封装模式。
我非常感谢对语言有更好理解的人提供第三种解决方案:)
提前谢谢你。
编辑:添加委托(delegate)声明:
id <ISDealersIDDelegate> delegate;
我将我的委托(delegate)声明为 id。它自己的委托(delegate)扩展了 UIViewController。
我可以看到声明它 NSObject 会起作用。
最佳答案
performSelectorOnMainThread:withObject:waitUntilDone:
方法在 NSObject
类中声明。如果您的委托(delegate)对象继承自 NSObject,您可以将其声明为
NSObject<MyDelegateProtocol> *delegate;
因此编译器将知道委托(delegate)响应 NSObject 的方法并且不会发出警告。
关于iphone - 编译器在 performSelectorOnMainThread :@selector(delegateMethod) 上发出警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4499343/
我有一个 NSOperation 包装了一些网络服务功能。 NSOperation 有一个委托(delegate),当操作结束时会收到消息。 由于 NSOperation 位于不同的线程上,我必须这样
我是一名优秀的程序员,十分优秀!