1

AFJSONRequestOperation从两个视图控制器运行两个,它们一个接一个地被调用:

视图控制器1:

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.."];

视图控制器2:

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,因为这两个操作位于单独的控制器中。那么如何确保一个人等到第一个完成后才向用户显示两个状态消息呢?

4

1 回答 1

1

几个想法:

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

  2. 不过,这是一个有争议的问题,因为您还可以在第一个操作完成时建立第二个操作的依赖关系,而无需使用共享队列。您只需将NSOperation第一个请求从第一个控制器传递给第二个控制器,然后将第一个操作设置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
于 2013-06-04T02:44:06.607 回答