Ric*_*kiG 8 iphone objective-c
我有一个包含一些Web服务功能的NSOperation.NSOperation有一个委托,当操作结束时将被发送消息.
由于NSOperation生活在一个不同的线程上,我必须像这样打电话:
[delegate performSelectorOnMainThread:@selector(getDealersIDSuccess:) withObject:result waitUntilDone:YES];
Run Code Online (Sandbox Code Playgroud)
它工作正常,但它给了我一个警告:
警告:'-performSelectorOnMainThread:withObject:waitUntilDone:'在协议中找不到
我完全同意这个编译器,它看到一个委托,它检查协议,它没有找到performSelector方法的声明.
我的问题是:我可以通过以不同的方式拨打此电话来删除警告吗?
我的两个猜测是我可以(1)编写一个名为的方法
- (void) callDelegateMethodOnMainThred {
[delegate getDealersIDSuccess:result]
}
Run Code Online (Sandbox Code Playgroud)
并通过performSelectorOnMainThread调用它,但我发现这个解决方案很麻烦,而且是一个额外的,难以阅读的,在代表团之上.
第二个解决方案可能是将委托转换为选择器内部父类对象的类型,但这只是简单的疯狂而且违背了委托封装模式.
我非常感谢能够更好地理解语言的第三个解决方案:)
先感谢您.
编辑:添加委托声明:
id <ISDealersIDDelegate> delegate;
Run Code Online (Sandbox Code Playgroud)
我声明我的代表是id.委托它自己扩展UIViewController.
我可以看到声明NSObject会起作用.
Vla*_*mir 18
performSelectorOnMainThread:withObject:waitUntilDone:方法在NSObject类中声明.如果您的委托对象继承自NSObject,则可以将其声明为
NSObject<MyDelegateProtocol> *delegate;
Run Code Online (Sandbox Code Playgroud)
因此编译器将知道委托响应NSObject的方法,并且不会发出警告.