1

私は2AFJSONRequestOperationつのView Controllerから2つを実行しています。それらは次々に呼び出されます:

ビューコントローラー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.."];

問題は、表示されるステータスが 2 番目の操作のみであることです。Loading categories..ただし、ネットワークと JSON 結果の取得の両方を正常に完了しました。

NSOperationQueue2つの操作が別々のコントローラーにあるため、使用できないようです。では、両方のステータス メッセージをユーザーに表示するために、最初のメッセージが完了するまで待機させるにはどうすればよいでしょうか。

4

1 に答える 1

1

いくつかの考え:

  1. 本当に必要な場合は、2 つの操作に同じ操作キューを使用できます。操作キューを最初のコントローラーから 2 番目のコントローラーに渡します。または、キューにシングルトン クラスを使用することもできます。

  2. ただし、共有キューを使用せずに、最初の操作の完了時に 2 番目の操作の依存関係を確立することもできるため、これは議論の余地があります。最初のコントローラから 2 番目のコントローラに最初のリクエストを渡し、NSOperationその最初の操作を 2 番目のコントローラに設定するdependencyだけです。

  3. ただし、これも議論の余地があります。必要がないのに、シリアル操作の人為的な制約を導入する必要があるからです。2 つのネットワーク操作は、順次ではなく同時に実行すると、かなり高速に実行できます。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 に答える