我希望获取返回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)。我记录并看到每次'data'变量初始化时URL都不同。
这样做的更好方法是什么?
我使用NSJSONSerialization来解析JSON。
答案 0 :(得分:2)
有更好的方法可以做到这一点。您尝试执行的操作的问题在于它是同步的,这意味着您的应用必须等待此操作完成才能执行任何其他操作。我绝对会建议只需使用NSURLConnection
和NSURLRequests
并为其设置委托,就可以将其变为异步调用。
它们的设置和管理相对简单,可以让您的应用程序运行一百万倍。
我回家后会发布一些示例代码以便稍后执行此操作。
<强>更新强>
首先,调用这些连接的类需要是接口文件中连接的委托,所以像这样。
<强> ViewController.h 强>
@interface ViewController: UIViewController <NSURLConnectionDelegate, NSURLConnectionDataDelegate> {
NSMutableData *pageData;
NSURLConnection *pageConnection;
}
然后,您需要在实现中创建/初始化必要的变量
<强> ViewController.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,但您可以根据需要设置它。您当然必须跟踪所有必要的NSURLConnections
,以便您知道在何处放置您收到的数据,以及在出现故障或连接成功完成时应采取的措施,但是并不是我所给予的艰难延伸。
如果您发现任何明显错误或某些内容无效,请告知我们。