0

多くのjsonデータを返すWebメソッドがあります。データをフェッチする別のクラスがあります。このクラスでは、次のことを行います。

+ (NSDictionary *)executeGenkFetch:(NSString *)query
{
    query = [NSString stringWithFormat:@"%@&format=json&nojsoncallback=1", query];
    query = [query stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    // NSLog(@"[%@ %@] sent %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd), query);
    NSData *jsonData = [[NSString stringWithContentsOfURL:[NSURL URLWithString:query] encoding:NSUTF8StringEncoding error:nil] dataUsingEncoding:NSUTF8StringEncoding];
    NSError *error = nil;
    NSDictionary *results = jsonData ? [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers|NSJSONReadingMutableLeaves error:&error] : nil;
    if (error) NSLog(@"[%@ %@] JSON error: %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd), error.localizedDescription);
    // NSLog(@"[%@ %@] received %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd), results);
    return results;
}

+ (NSArray *)GetNieuws
{
    NSString *request = [NSString stringWithFormat:@"http://www.krcTest.be/mobile/json/request/webmethod"];
    return [[self executeGenkFetch:request] valueForKeyPath:@"news.title"];
}

これで、データを使用してNSLogを実行するためのボタンができました。ここに、ボタンの背後にあるアクションが表示されます。

- (IBAction)testFetch:(id)sender {
    NSArray *nieuws;
    nieuws = [GenkData GetNieuws];
    NSLog(@"%@",nieuws);

}

私のログでは常にこれが表示されます。

2012-10-01 10:52:16.379 RacingGenk [13434:c07](null)

誰か助けてもらえますか?

4

2 に答える 2

1

エンドポイントで DNS エラーが発生するため、データがない理由が説明される可能性がありますが、匿名化している可能性があると仮定すると、これを自分でデバッグする方法はたくさんあります。

このようにメソッド呼び出しを連鎖させないことから始めます。

  NSData *jsonData = [[NSString stringWithContentsOfURL:[NSURL URLWithString:query] encoding:NSUTF8StringEncoding error:nil] dataUsingEncoding:NSUTF8StringEncoding];

代わりに優先します(特に、あなたが行っていた方法では、1回の呼び出しからのエラー応答が欠落していたことに注意してください)。

   NSError *error = nil;
   NSURL *request = [NSURL URLWithString:query];
   NSLog(@"Outgoing Request: %@",[request description]);
   NSString *response =  [NSString stringWithContentsOfURL:request encoding:NSUTF8StringEncoding error:nil];

   if (error) { 
       NSLog(@"ERROR: Unable to get response %@",[error localizedDescription]); 
   }

   NSLog("@Synchronous Response: %@",response);

   NSData *jsonData = [response dataUsingEncoding:NSUTF8StringEncoding];
   NSDictionary *results = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers|NSJSONReadingMutableLeaves error:&error];

   if (error) { 
       NSLog(@"ERROR: Unable to parse JSON %@",[error localizedDescription]); 
   }

メソッド呼び出しを連鎖させないことで、中間結果を出力して問題の原因を確認できるようになりました。また、ブレークポイントを使用して、より適切にステップ実行することもできます。

私がここにいる間、このようなメソッドをインスタンス メソッドではなくクラス メソッドとして使用するのは奇妙です。このような同期ネットワークの使用は、そうでないと思われる別のスレッドで実行していない限り、UI のパフォーマンスを損なうことに注意する必要があります。 . 代わりに、NSURLConnection の非同期ネットワーク メソッドを参照することをお勧めします。

これは PC で入力しているため、上記の構文チェックは行っていませんが、正しい方向を示しているはずです。

于 2012-10-01T09:26:09.030 に答える
-1

JSON / XMLの処理と、Webリクエスト全体の処理を容易にするAFNetworkingの使用をお勧めします。ここでそれについて読むことができます... https://github.com/AFNetworking/AFNetworking

GitHubReadmeからのJSONサンプルリクエスト...

NSURL *url = [NSURL URLWithString:@"http://api.twitter.com/1/statuses/public_timeline.json"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
    NSLog(@"Public Timeline: %@", JSON);
} failure:nil];
[operation start];
于 2012-10-01T09:04:05.773 に答える