FxPlug主线程与自定义窗口通信问题:自定义窗口回传图片数据失败
问题:自定义窗口通过代理回传图片数据失败,怀疑线程问题?
我尝试从自行创建的自定义窗口回传图片数据,用了代理但完全没生效,不确定是不是因为自定义窗口和接收代理的插件类处于不同线程导致的失败。
代理协议代码
@protocol ViewShotDelegate<NSObject> - (void) SentHelp:(NSString *) data; @end
MainPlugin插件类实现代码
@implementation MainPlugin - (void) SentHelp:(NSString *) data{ NSLog(data); } @end
CustomWindow类声明
@interface CustomWindow: NSWindowController <ViewShotDelegate> // ... 其他内容 @end
先从几个最容易踩坑的点排查起,线程问题确实有可能,但咱们先把基础配置的坑填上:
- 代理对象有没有正确赋值? 这是代理失效最常见的原因!你在创建CustomWindow实例的时候,是不是给它的
delegate属性赋值了MainPlugin的实例?比如有没有写类似customWindow.delegate = mainPluginInstance;的代码?如果没这一步,代理方法根本找不到回调的对象,自然不会触发。 - 线程不匹配的解决尝试 如果自定义窗口是在子线程创建或触发代理的,那回调到主线程的MainPlugin时可能会出问题。你可以在CustomWindow里触发代理的地方,强制切回主线程调用:
加个dispatch_async(dispatch_get_main_queue(), ^{ if ([self.delegate respondsToSelector:@selector(SentHelp:)]) { [self.delegate SentHelp:yourData]; } });respondsToSelector判断还能避免代理对象没实现方法导致崩溃。 - 检查对象生命周期 会不会MainPlugin的实例在CustomWindow触发代理之前就被释放了?记得给CustomWindow的代理属性加上
weak修饰(@property (weak, nonatomic) id<ViewShotDelegate> delegate;),同时确认MainPlugin实例的生命周期足够长,能覆盖到代理回调的时机。 - 关于图片数据的小建议 你现在代理传的是NSString,但要回传图片的话,直接传
NSData *会更合适,避免转字符串过程中出现数据丢失或格式问题,记得同步修改协议和实现的参数类型。
内容的提问来源于stack exchange,提问作者Kien Nguyen
相关产品推荐
相关产品推荐

