gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 03:30:26 24 4
gpt4 key购买 nike

我有一个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com