gpt4 book ai didi

cocoa - 我应该如何从委托(delegate)方法返回 NSError 对象?

转载 作者:行者123 更新时间:2023-12-03 17:37:22 26 4
gpt4 key购买 nike

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

我现在拥有的委托(delegate)方法是:

-(void)server:(MBServer*)server
willSendData:(NSMutableString*)data
error:(NSError**)error;

此时,委托(delegate)可以通过修改传入的 NSMutableString 来为服务器提供要发送的数据。此外,它还可以通过将 error 变量设置为来创建要发回的 NSError新的 NSError 实例。

我遇到的问题是委托(delegate)方法可能会通过 NSInitation 从另一个线程调用。委托(delegate)可以创建一个新的 NSError 对象,但它会在其他线程收到响应之前在当前线程中自动释放。

在单线程应用程序中,这不会成为问题,因为委托(delegate)者可以立即保留响应,但我不能在多线程设计中这样做(同样是因为当前的事件循环会自动释放它) )。委托(delegate)人必须保留错误,以便委托(delegate)人可以释放它。

这是针对公共(public) 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;

我还考虑过传递一个可变字典并要求委托(delegate)填写错误。然后字典将保留错误,并跨线程安全地将其取回。

// Send your NSError response in the dictionary with the key
// MBServerErrorResponseKey

-(void)server:(MBServer*)server
willSendData:(NSMutableString*)data
response:(NSMutableDictionary*)response;

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

谢谢。

最佳答案

这样怎么样:不直接调用委托(delegate)方法,而是通过 NSInitation 调用“trampoline”方法。蹦床(您将实现的)只会调用委托(delegate)方法,并在返回之前保留错误。换句话说:蹦床(可能是服务器对象上的一个方法)只会用传递的参数包装对委托(delegate)的调用,然后保留错误并返回。

关于cocoa - 我应该如何从委托(delegate)方法返回 NSError 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/827508/

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