我的NSMutableArray
中有4个元素。我有这个简洁的代码,用于下载文件并在UITextView
中显示文件的数据以进行测试。没有for
循环,一切都很好。给我问题的代码在这个函数中:
- (void)complexDownload {
int i;
for (i=0; i < downloadArray.count; i++) {
if (isBusy == NO) {
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
downloadURL = [downloadArray objectAtIndex:i];
NSLog(@"URL is %@", downloadURL);
NSLog(@"Downloading object at index %i", i);
NSURL *url = downloadURL;
NSURLRequest *theRequest=[NSURLRequest requestWithURL:url
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:60.0];
NSURLConnection *theConnection = [NSURLConnection connectionWithRequest:theRequest delegate:self];
if (theConnection) {
self.downloadData = [NSMutableData data];
isBusy = YES;
NSLog(@"Busy value in download cycle equals %i, downloading", isBusy);
} else {
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
NSLog(@"Connection failed");
isBusy = NO;
}
}
}
}
我首先认为问题可能出在isBusy
BOOL
,但即使没有if
条件,应用也会崩溃。编译器给我没有错误,但这一个:
Here's the link for the big screenshot
其余功能如下:
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
[downloadData appendData:data];
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
NSString *dataString = [[NSString alloc] initWithData:downloadData encoding:NSASCIIStringEncoding];
self.dataTextView.text = dataString;
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
NSLog(@"Download finished!");
isBusy = NO;
}
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
NSLog(@"%@", error);
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
}
所有NSLogged值都很好,Array有链接,所有链接都是正确的。
答案 0 :(得分:6)
我的猜测是,在某些时候downloadArray[i]
在某些时候是腐败的,或者它不是NSUrl。代码在CFURLCopyAbsoluteURL()
调用[NSURLRequest requestWithURL...]
时崩溃。
答案 1 :(得分:1)
您使用async api initWithRequest:delegate:并尝试使用 isBusy 标志使其同步。这种方法开始时非常错误,NSURLConnection类足够智能,如果正确使用它,不需要使用任意标志。 你应该认真考虑使用NSOperations或GCD。如果您计划进行更复杂的连接编程,可以考虑使用像RestKit这样的第三方框架。
答案 2 :(得分:1)
摆脱for循环和isBusy指标。
在complexDownload
中,始终只处理第一个或最后一个(更合适的)对象,然后将其从数组中删除。在connectionDidFinish
再次调用complexDownload
。请使用performSelector
。等待时间甚至可能是0.0f。通过这样做,您的downloadArray
将充当某种排队。
答案 3 :(得分:1)
我认为这是[NSURLRequest requestWithURL:url中url-object的问题 没有必要在额外的对象中复制URL。试试这个:
NSLog(@"URL is %@", [downloadArray objectAtIndex:i]);
NSLog(@"Downloading object at index %i", i);
NSURL *url = [downloadArray objectAtIndex:i];
(或在downloadURL之前添加self。)
如果您的downloadArray包含NSStrings:
NSURL *url = [NSURL URLWithString:[downloadArray objectAtIndex:i]];
我建议使用像[ASIHTTPRequest]这样的外部框架(http://allseeing-i.com/ASIHTTPRequest/