编译器在performSelectorOnMainThread上发出警告:@selector(delegateMethod)

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的方法,并且不会发出警告.