gpt4 book ai didi

objective-c - Objective-C 中的异步初始化

转载 作者:搜寻专家 更新时间:2023-10-30 19:54:03 24 4
gpt4 key购买 nike

我目前正在为 API 制作一个 Objective-C 库。为了轻松管理数据,我创建了一些充当模型的类。

例如,我有一个 Account 类,其中包含有关一个特定帐户的所有数据。我想让初始化这个类变得容易,我想到了这样的事情:

@interface Account : NSObject

@property (nonatomic, readonly) NSUInteger accountID;
@property (nonatomic, readonly) NSString *username;

// Other properties...

+ (instancetype)accountWithUsername:(NSString *)username success:(void (^)(Account *))success failure:(void (^)(NSError *))failure;
- (instancetype)initWithUsername:(NSString *)username success:(void (^)(Account *))success failure:(void (^)(NSError *))failure;

@end

@implementation Account

+ (instancetype)accountWithUsername:(NSString *)username success:(void (^)(Account *))success failure:(void (^)(NSError *))failure
{
return [[JPImgurAccount alloc] initWithUsername:username success:success failure:failure];
}

- (instancetype)initWithUsername:(NSString *)username success:(void (^)(Account *))success failure:(void (^)(NSError *))failure
{
self = [super init];

// Launch asynchronous requests, the callback will be called when it's finished

return self; // Returning an empty object until the asynchronous request is finished
}

@end

但是,通过 init 方法返回一个空对象让我有点困扰,我问自己这是否是一个真正的好主意,但我找不到为什么它会有风险。

所以我问你:我可以使用这个结构吗?如果不是,为什么?我是否应该以经典方式使用单个 init 方法耦合到 loadWithUsername:(NSString *)username success:(void (^)(JPImgurAccount *))success failure:(void (^ )(NSError *))失败方法?

谢谢。

最佳答案

我认为您的方法不是很好的做法。作为 API 的用户,当我看到以“init”开头的方法时,我希望返回的对象可以立即使用。看起来您需要使用工厂设计模式。使用此方法创建一个 AccountFactory 类:

+ (void)createAccountWithUsername:(NSString*)username success:(void (^)(Account *))success failure:(void (^)(NSError *))failure;

请注意它返回 void,因此用户明白该对象仅在请求成功完成后可用。此外,用户了解他不应该直接创建 Account 的实例。这就是我会使用的方法。

关于objective-c - Objective-C 中的异步初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17633827/

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