1

私は知っています、この質問は前に尋ねます。しかし、このシナリオではうまくいきません。私は転送レイヤーの AFNetworking に取り組んでいます。以下の私のコード。

AFHTTPRequestOperation *post; AFHTTPRequestOperationManager *マネージャー;


AFHTTPRequestOperationManager * manager = [AFHTTPRequestOperationManager manager];
    NSMutableDictionary *paramDict = [[NSMutableDictionary alloc] init] ;

    delegate = (id<ConnectionUtilDelegate>) delegateObject;

    for (Parameter *param in parameterArray)
    {
        [paramDict setObject:param.value forKey:param.name];
    }
    NSDictionary *params = paramDict;
    manager.responseSerializer = [AFJSONResponseSerializer serializer];
    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
    [manager.operationQueue cancelAllOperations];
    post = [manager POST:[NSString stringWithFormat:@"%@",url] parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSLog(@"JSON: %@", responseObject);
        [delegate requestCompleted:responseObject];
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        [delegate requestFailed:error];
        NSLog(@"Error: %@", error);
    }];

これは私の投稿リクエストです。それは魅力のような仕事です。ただし、一部のリクエストは遅れることがあります。たとえば、P1(Post 1) と P2(Post 2) という名前の 2 つの異なる投稿要求を送信します。これらのリクエスト応答が R1(応答 1) として返され、R2(応答 2) が返される場合は問題ありません。しかし、このリクエスト応答が R2(応答 2) として返され、R1(応答 1) よりも返された場合、それは私のアプリの原因です。そのため、新しいリクエストを送信するときに古いリクエストをキャンセルしたいです。と

[キャンセル後];

エラー: [AFHTTPRequestOperation キャンセル]: 割り当て解除されたインスタンス 0x1723cbf0 に送信されたメッセージ

私のために働いていません。何か提案はありますか?

4

1 に答える 1

1

コードでわかるように、AFHTTPRequestOperationManagerリクエストごとに新しいインスタンスを作成cancelAllOperationsし、新しく作成された の operationQueue に対して実行しAFHTTPRequestOperationManagerます。タイプの sharedManager を作成し、AFHTTPRequestOperationManagerすべてのリクエストにこのシングルトン オブジェクトを使用することをお勧めします。

+ (instancetype)sharedManager {
    static AFHTTPRequestOperationManager *instance;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        instance = [AFHTTPRequestOperationManager manager];
    });
    return instance;
}

次に、次を使用して、新しいリクエストを実行する前にすべてのリクエストをキャンセルできます。

+ (void)cancelAllRequests {
    [[AFHTTPRequestOperationManager sharedManager].operationQueue cancelAllOperations];
}

上記のメソッドを呼び出すと、すべてのリクエストが失敗し、failureブロックが呼び出されます。したがって、操作がcancelled障害ブロックにあるかどうかを確認する必要があります。最終的なコードは次のとおりです。

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager sharedManager];
NSMutableDictionary *paramDict = [[NSMutableDictionary alloc] init] ;


delegate = (id<ConnectionUtilDelegate>) delegateObject;

for (Parameter *param in parameterArray)
{
    [paramDict setObject:param.value forKey:param.name];
}
NSDictionary *params = paramDict;

manager.responseSerializer = [AFJSONResponseSerializer serializer];
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];

AFHTTPRequestOperation *post = [manager POST:[NSString stringWithFormat:@"%@",url] parameters:params

success:^(AFHTTPRequestOperation *operation, id responseObject) {
        [delegate requestCompleted:responseObject];

}
failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    if (!operation.cancelled) {
        [delegate requestFailed:error];
    }
}];

[post start];
于 2016-01-25T09:23:51.680 に答える