gpt4 book ai didi

ios - 类(不是实例)充当委托(delegate)是否可能/正确?

转载 作者:行者123 更新时间:2023-11-28 22:34:45 25 4
gpt4 key购买 nike

我正在构建用作 REST 服务器客户端的 iOS 应用程序。到目前为止,我一直在以非常简单的方式处理我的所有请求。每当我需要打电话时,我都会做类似的事情:

[ApiRequestManager sendApiCall:@"dogs/getSomeDog"
withParams:@{ @"dog_name": @"freddo" }
callback:^(NSDictionary *result) {
// do something with the response data already unserialized
// (comes as JSON) by the ApiRequestManager static method.
}];

随着应用程序越来越复杂,我意识到如果我真的将 NSMutableURLRequest 子类化并制定我自己的响应协议(protocol),它会更清晰(并且测试工作量更少),如下所示:

@protocol ApiRequestDelegate <NSObject>

- (void)apiRequest:(ApiRequest *)request didSucceedWithResult:(NSDictionary *)result;

@optional
- (void)apiRequest:(ApiRequest *)request didFailWithError:(NSError *)error;

@end

这使我能够将用于构建请求和处理响应等的代码分开。当我开始使用委托(delegate)模式替换我的旧调用时,一切都很好,但是!然后我意识到,我在这里和那里正在做这样的事情:

// in class Dog
+ (void)putLeashOnDogs:(NSArray *)dogs {
NSString *ids = // collect IDs from dogs

[ApiRequestManager sendApiCall:@"dogs/putLeash"
withParams:@{ @"dog_ids": ids }
callback:^(NSDictionary *result) {
// something
}];
}

我的问题是,我能否以某种方式说“此类是 X 协议(protocol)方法的静态版本”,然后在我创建委托(delegate)对象(即 ApiRequest 实例)的静态方法中直接说myRequest.delegate = self ?如果我不能或有更好/更清洁/更正确的方法来解决这个问题,我有什么选择?

最佳答案

我可能是错的,但听起来您遇到的问题类似于使用 NSURLConnection 进行多个同时下载的问题 - 也就是说,对于每个这样的 NSURLConnection,我们需要一个单独的委托(delegate)来接收结果。如果是这样,我认为简单的解决方案不是在类级别统一,而是恰恰相反,将需要分离的所有内容体现为一个单独的对象。

我有一个 MyDownloader 类,它具有 connection 属性以及所有委托(delegate)方法。要使用它,我们实例化它,初始化 connection 属性,并告诉它开始。每个 MyDownload 负责其自己的 NSURLConnection,并且是该连接的委托(delegate)。我们现在有效地将问题提升了一个层次:我们现在不是聚集多个 NSURLConnections 的猫,而是聚集多个 MyDownloader 实例的猫,每个实例至少必须保留到下载完成。但这是一个简单的问题;例如,一个极简主义的解决方案是将它们存储在 NSMutableSet 中。

好的,这对有什么有帮助吗?还是我只是花了两段时间谈论与您的问题完全不相关的事情?

关于ios - 类(不是实例)充当委托(delegate)是否可能/正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16410128/

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