gpt4 book ai didi

ios - 如何同时管理来自两个不同 Controller 的两个 AFNetworking 操作

转载 作者:行者123 更新时间:2023-11-29 13:12:21 24 4
gpt4 key购买 nike

我从两个 View Controller 运行两个 AFJSONRequestOperation,它们一个接一个地被调用:

viewcontroller1:

AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON){

//
}failure:^(NSURLRequest *request, NSHTTPURLResponse *response,NSError *error, id JSON){
//
}];
[operation start];
[SVProgressHUD showWithStatus:@"Searching for products, please wait.."];

viewcontroller2:

AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON){

//
}failure:^(NSURLRequest *request, NSHTTPURLResponse *response,NSError *error, id JSON){
//
}];
[operation start];
[SVProgressHUD showWithStatus:@"Loading categories.."];

问题是显示的状态仅适用于第二个操作:Loading categories.. 尽管他们完成了网络连接并获得了 JSON 结果。

我似乎不能使用 NSOperationQueue,因为这两个操作在不同的 Controller 中。那么如何确保一个人等到第一个完成后向用户显示两个状态消息?

最佳答案

几个想法:

  1. 如果您确实需要,您当然可以为这两个操作使用相同的操作队列。您要么将操作队列从第一个 Controller 传递到第二个 Controller 。或者,您可以为队列设置一个单例类。

  2. 不过,这是一个有争议的问题,因为您还可以在第一个操作完成后建立第二个操作的依赖关系,而无需使用共享队列。您只需要将第一个请求的 NSOperation 从第一个 Controller 传递到第二个 Controller ,然后将第一个操作设置为第二个的 dependency一个。

  3. 不过,这也是一个有争议的问题,因为如果不需要的话,为什么要引入串行操作的人为约束。如果同时运行而不是顺序运行,则两个网络操作可以运行得相当快。为了简化更新 HUD 的工作而以较慢的性能来惩罚用户似乎是一种耻辱。

  4. 在我看来,正确的解决方案是支持并发操作并适当更新 HUD。也许维护一个可变的状态消息数组,您可以在列表中添加和删除这些消息。

也许是这样的:

@interface HUDStatus ()
@property (nonatomic, strong) NSMutableArray *statusMessages;
@end

@implementation HUDStatus

+ (instancetype)sharedHudManager
{
static id sharedMyManager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedMyManager = [[self alloc] init];
});
return sharedMyManager;
}

- (id)init
{
self = [super init];
if (self) {
_statusMessages = [[NSMutableArray alloc] init];
}
return self;
}

- (void)addMessage:(NSString *)message
{
[self.statusMessages addObject:message];
[SVProgressHUD showWithStatus:message];
}

- (void)removeMessage:(NSString *)message
{
__block BOOL didFindMessage = NO;

// remove the message (not sure which one it is, so we'll look through all of them

[self.statusMessages enumerateObjectsWithOptions:0 usingBlock:^(NSString *oldMessage, NSUInteger idx, BOOL *stop) {
if ([oldMessage isEqualToString:message])
{
[self.statusMessages removeObjectAtIndex:idx];
didFindMessage = YES;
*stop = YES;
}
}];

if (!didFindMessage)
NSLog(@"%s: Trying to remove '%@' but it was not found in %@", __FUNCTION__, message, self.statusMessages);

// if, having removed
if ([self.statusMessages count] > 0)
[SVProgressHUD showWithStatus:[self.statusMessages lastObject]];
else
[SVProgressHUD dismiss]; // I don't know this class, so I don't know what the name of the method to dismiss the HUD
}

@end

关于ios - 如何同时管理来自两个不同 Controller 的两个 AFNetworking 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16907632/

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