0

我有一个返回大量 json 数据的 webmethod。我有一个单独的类来获取我的数据。在这堂课中,我做了以下事情。

+ (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](空)

有人可以帮助我吗?

4

2 回答 2

1

您的端点给出了一个 DNS 错误,这可以解释为什么您没有数据,但是假设您可能已经对其进行了匿名化,那么您有很多方法可以自己调试它。

首先不要像这样将方法调用链接在一起;

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

而是更喜欢(并特别注意您错过了一次调用的错误响应);

   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

我可以建议使用 AFNetworking,它可以更轻松地处理 JSON/XML 以及整体的 Web 请求。你可以在这里阅读... https://github.com/AFNetworking/AFNetworking

来自 GitHub 自述文件的 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 回答