【发布时间】:2009-05-06 00:17:55
【问题描述】:
我正在设计一个委托方法,当远程服务器需要来自委托的输入时调用该方法。此时的委托负责填写要发送到服务器的数据,并告诉服务器此时是否有错误。
我现在的委托方法是:
-(void)server:(MBServer*)server
willSendData:(NSMutableString*)data
error:(NSError**)error;
此时,delegate 可以通过修改传入的 NSMutableString 来为服务器提供要发送的数据。此外,它可以通过将 error 变量设置为新的 NSError 实例来创建要发送回的 NSError。
我遇到的问题是委托方法可能会通过 NSInvocation 从另一个线程调用。委托可以创建一个新的 NSError 对象,但它会在其他线程收到响应之前在当前线程中自动释放。
在单线程应用程序中,这不是问题,因为委托人可以立即保留响应,但在多线程设计中我不能这样做(再次因为当前事件循环会自动释放它)。委托人必须保留错误,以便委托人可以释放它。
这是针对公共 api 的,我不喜欢通过文档要求实现者知道他们必须保留错误对象的想法。好像太不安全了。
// You *must* retain the returned error before
// passing it back or you will crash
-(void)server:(MBServer*)server
willSendData:(NSMutableString*)data
error:(NSError**)error;
我想到的其他想法是发送一个 NSError 作为返回值(似乎有些不标准,因为大多数方法返回一个布尔值并采用 NSError 双指针)。它看起来也很奇怪。
-(NSError *)server:(MBServer*)server
willSendData:(NSMutableString*)data;
我还考虑过传递一个可变字典并要求委托填写错误。然后字典会保留错误,安全地跨线程取回。
// Send your NSError response in the dictionary with the key
// MBServerErrorResponseKey
-(void)server:(MBServer*)server
willSendData:(NSMutableString*)data
response:(NSMutableDictionary*)response;
有没有人处理过这个设计问题,如果有,你的解决方案是什么?
谢谢。
【问题讨论】: