我应该如何从委托方法返回NSError对象?

时间:2009-05-06 00:17:56

标签: cocoa api

我正在设计一个委托方法,当远程服务器需要来自委托的输入时,该方法被调用。此时的代理负责填写要发送到服务器的数据,并告知服务器此时是否有错误。

我现在的委托方法是:

-(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;

有没有人处理过这个设计问题,如果有的话,你的解决方案是什么?

谢谢。

2 个答案:

答案 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而不是传入指针也可能更有意义。