3

これは私の AFHTTPClient シングルトンです:

+ (API *)sharedInstance
{
static API *sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
    sharedInstance = [[API alloc] initWithBaseURL:[NSURL URLWithString:kAPIHost]];
    [sharedInstance setParameterEncoding:AFJSONParameterEncoding];
    [sharedInstance registerHTTPOperationClass:[AFXMLRequestOperation class]];
    [sharedInstance setDefaultHeader:@"Accept" value:@"application/rss+xml"];
});

return sharedInstance;
}

そして、同じクラスのメソッド (AFHTTPClient):

- (void)requestXMLDataCompletion:(JSONResponseBlock)completionBlock
{
NSMutableURLRequest *apiRequest = [self requestWithMethod:@"GET" path:kAPIPath parameters:nil];

AFXMLRequestOperation *operation = [[AFXMLRequestOperation alloc] initWithRequest:apiRequest];

[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject){
    // success
    completionBlock(responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    // failure
    completionBlock([NSDictionary dictionaryWithObject:[error localizedDescription] forKey:@"error"]);
}];

[operation start];
}

この関数を呼び出して RSS から XML を取得すると、次のエラーが発生します。

error = "Expected content type {(\n    \"application/xml\",\n    \"text/xml\"\n)}, got application/rss+xml";

質問:

  1. 実装されたシングルトンの全体的なコンセプトは適切で、何か変更が必要ですか?

  2. コンセプト全体が間違っている場合、何か提案はありますか?

  3. このエラーが発生するのはなぜですか?

ありがとう。

4

2 に答える 2

3
  • Concept of Singleton

    シングルトンは、デザイン パターンとしてより一般的に知られています。通常、シングルトンはクラスであり、他のクラスとまったく同じように動作します。唯一の例外は、シングルトンのインスタンスが同じオブジェクト データを参照することです。これは、シングルトン クラスのすべてのインスタンスが実際にはすべて同じインスタンスであることを意味します。

シングルトンの使用方法を強制するための詳細とサンプル コードについては、シングルトン パターンを確認してください。

  • Is there any suggestion if whole concept is wrong ?

    シングルトンのインスタンスは 1 つしかないため、AFNetworking にはシングルトンを使用することをお勧めします。

  • Your Error

    発生しているエラーは、AFNetworking リクエストが Header Content-Type を「application/xml」または「text/xml」として要求しているためです。

このコードを変更してみてください:

[self registerHTTPOperationClass:[AFXMLRequestOperation class]]; 

[self registerHTTPOperationClass:[AFHTTPRequestOperation class]]; 
于 2013-05-27T20:02:23.683 に答える
1

同様の問題がありました:

Error Domain=AFNetworkingErrorDomain Code=-1016 "Expected content type {(
    "text/xml",
    "application/xml"
)}, got application/rss+xml"

上記の回答は完全で明確ではありませんが、彼らのチャットを読んだ後は大いに役立ちました. registerHTTPOperationClass役に立ちません。私はいくつかのコードを提供することにしました。解決策はこれを使用しないことです:

[AFXMLRequestOperation XMLParserRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, NSXMLParser *XMLParser)

ただし、次RSS XMLを使用してダウンロードし、手動でAFHTTPRequestOperation作成します。NSXMLParser

NSString *articlesUrlString = @"http://pro.rabota.ru/feed/moscow.content.rss";
AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:articlesUrlString]];
NSMutableURLRequest *request = [httpClient requestWithMethod:@"GET" path:@"" parameters:nil];

AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {

  NSData *xmlData = (NSData *)responseObject;
  NSXMLParser *XMLParser = [[NSXMLParser alloc] initWithData:xmlData];
  XMLParser.delegate = self;
  [XMLParser parse];

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {

  NSLog(@"error: %@", error);

}];
于 2014-10-20T15:17:44.893 に答える