2

プロジェクトで AFNetworking をネットワーク層として使用しています。画像の場合、キャッシングに関連する問題がいくつかあったため、フレームワークを 3.0 バージョンに更新しました。

更新プロセス中に、メディア コンテンツ (画像とビデオ) を取得するリクエストに問題が発生しました。

これは私のクラスです:

+ (void)requestWithMethod:(NSString*)methodTypeValue path:(NSString*)pathValue parameters:(NSDictionary *)params token:(NSString*)token debug:(BOOL)debug completionHandler:(void (^)(id result, NSError *error))block {
    if(debug){
        NSLog(@"Method Type  = %@ \n",methodTypeValue);
        NSLog(@"Link = %@ \n",pathValue);
        NSLog(@"Token = %@", token);
    }

    NSString *linkRequest = [NSString stringWithFormat:@"%@%@",GatewayRoot,pathValue];
    AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];

    NSMutableURLRequest *req = [[AFJSONRequestSerializer serializer] requestWithMethod:methodTypeValue URLString:linkRequest parameters:nil error:nil];

    [req setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    if (token) {
       [req setValue:token forHTTPHeaderField:@"AccessToken"];
    }

    [[manager dataTaskWithRequest:req completionHandler:^(NSURLResponse * _Nonnull response, id  _Nullable responseObject, NSError * _Nullable error) {
        if (!error) {
                if (debug) {
                    NSLog(@"response:\n %@ \n",responseObject);
                }
            block(responseObject,nil);
        } else {
            NSLog(@"Error: %@, %@, %@", error, response, responseObject);
            block(nil, error);
        }
    }] resume];
}

私はテストを行い、通常のリクエストに関連してすべて問題ありません。サーバーからいくつかの画像とビデオを取得する必要があり、次のエラーが表示されます。

NSLocalizedDescription=リクエストが失敗しました: 受け入れられないコンテンツ タイプ: image/png NSLocalizedDescription=リクエストが失敗しました: 受け入れられないコンテンツ タイプ: video/mp4

私はこの方法でコンテンツタイプを設定しようとしました:

manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"image/jpeg",@"video/mpeg",...nil];

manager.responseSerializer.acceptableContentTypes =[manager.responseSerializer.acceptableContentTypes setByAddingObject:@"image/jpeg",@"video/mpeg",...nil];
  1. 受け入れ可能なコンテンツ タイプを設定する方法を教えてください。

  2. 画像のキャッシュに関連する他の問題があります: 古いバージョンでログインしてユーザー プロファイルの画像を取得し、ログアウトして他の資格情報で再ログインした後、ユーザー プロファイルの同じ画像を受け取りました (これは関連する問題であることがわかりました)。 AFNetworking キャッシュ イメージ)。

キャッシュのクリア リクエスト フローについて教えてください。

助けてくれてありがとう!

4

1 に答える 1

5

許容可能なコンテンツ タイプを自分で設定するのではなく、適切なresponseSerializer. たとえば、 が必要な場合は、次のようUIImageにします。

manager.responseSerializer = [AFImageResponseSerializer serializer];

が必要な場合は、次のNSDataことができます。

manager.responseSerializer = [AFHTTPResponseSerializer serializer];

リクエストをキャッシュしたくない場合は、キャッシュ レスポンス ブロックを に設定req.cachePolicyするNSURLRequestReloadIgnoringCacheDataか実装する必要があります。もちろん、サーバーを変更して、キャッシュすべきではないリソースのヘッダー フィールドが適切に設定されるようにすることもできます。AFURLSessionManagersetDataTaskWillCacheResponseBlock

于 2016-04-16T16:57:51.663 に答える