-1

我希望为返回 JSON 数据的 URL 数组获取数据。我正在尝试以下代码:

for (int i =0; i<numberOfDays; i++)
{
    NSData *data = [NSData dataWithContentsOfURL:[wordURLs objectAtIndex:i]];
    NSLog(@"%@",[wordURLs objectAtIndex: i]);
    [self performSelectorOnMainThread:@selector(fetchedData:) withObject:data waitUntilDone:YES];
}

'wordURLs' 是 URL 数组,在我的 'fetchedData:' 方法中,我将返回的 JSON 数据保存到 plist 文件中。

问题在于,对于循环运行的所有次数,仅返回一/两个特定 URL 的数据(例如,索引为 1 和 3 或 1 和 2 等的 url)。我记录并看到每次初始化“数据”变量时的 URL 都不同。

有什么更好的方法来做到这一点?

我使用 NSJSONSerialization 来解析 JSON。

4

1 回答 1

2

有很多更好的方法可以做到这一点。您尝试执行的操作的问题在于它是同步的,这意味着您的应用必须等待此操作完成,然后才能执行其他操作。NSURLConnection我绝对会建议通过简单地使用andNSURLRequests并为它们设置委托来将其变为异步调用。

它们的设置和管理相对简单,将使您的应用程序运行顺畅一百万倍。

稍后我回家后会发布一些示例代码来执行此操作。

更新

首先,调用这些连接的类需要成为接口文件中连接的委托,所以像这样。

视图控制器.h

@interface ViewController: UIViewController <NSURLConnectionDelegate, NSURLConnectionDataDelegate> {
    NSMutableData *pageData;
    NSURLConnection *pageConnection;
}

然后你需要在你的实现中创建/初始化必要的变量

视图控制器.m

-(void) viewDidLoad {
       pageData = [[NSMutableData alloc] init];
       NSURLRequest *pageRequest= [[NSURLRequest alloc] initWithURL:pageURL cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:4];
       pageConnection = [[NSURLConnection alloc] initWithRequest:pageRequestdelegate:self];
}

然后,您还需要在检索数据时调用的委托函数。

-(void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    if (connection == pageConnection) {
        [pageData appendData:data];
    }
}

-(void) connectionDidFinishLoading:(NSURLConnection *)connection {
    if (connection == pageConnection) {
        // Do whatever you need to do with the data
    }
}

-(void) connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {

    if (connection == pageConnection) {
        // Do something since the connection failed
    }
}

当然,这个例子只包括一个正在加载的 URL,但你可以根据需要添加任意数量的 URL。当然,您必须跟踪所有必要的NSURLConnections信息,以便知道将收到的数据放在哪里,以及在发生故障或连接成功完成时要采取的措施,但这不是硬性扩展从我给的。

如果您发现任何明显的错误或某些东西不起作用,请告诉我。

于 2013-07-08T18:01:24.913 回答