我正在设计一个委托方法,当远程服务器需要来自委托的输入时,该方法被调用。此时的代理负责填写要发送到服务器的数据,并告知服务器此时是否有错误。
我现在的委托方法是:
-(void)server:(MBServer*)server
willSendData:(NSMutableString*)data
error:(NSError**)error;
此时,委托可以通过修改传入的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作为返回值(似乎有点非标准,因为大多数方法返回一个bool并采用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;
有没有人处理过这个设计问题,如果有的话,你的解决方案是什么?
谢谢。
答案 0 :(得分:3)
如何:不是直接调用委托方法,而是通过NSInvocation调用“trampoline”方法。 trampoline(你将实现)只会调用委托方法,并在返回之前保留错误。换句话说:trampoline(可能是你服务器对象上的一个方法)只是用传递的参数包装对委托的调用,然后保留错误并返回。
答案 1 :(得分:0)
你可以做的一件事就是尝试像
这样的东西-(void)server:(MBServer*)server
willSendData:(NSMutableString*)data
shouldStop:(BOOL*)stopFlag;
-(NSError*)getLastErrorForServer:(MBServer*)server;
这将允许委托通过设置stopFlag
向服务器发出错误信号,然后服务器可以调用getLastErrorForServer:
方法来获取实际出错的地方。使server:WillSendData:
方法返回BOOL
而不是传入指针也可能更有意义。