我已经在SOF上搜索了这个问题好几天了,但我还没有找到解决方案(说同样的问题)。
我正在制作和应用程序,在URL列表中同时下载5个图像(每个图像在不同的服务器上)。
我有一个ImageDownloader
类子类NSOperation
并实现了NSURLConnectionDataDelegate
。
这样我就可以将ImageDownloader
的实例添加到operationQueue
中的ViewController
,它将在operationQueue
下的单独线程中运行。将下载程序添加到operationQueue
的行位于:
downloader = [[ImageDownloader alloc] init];
[downloader downloadImageWithURL:[controller.URList objectForKey:[NSString stringWithFormat:@"%d",downloadIndex]] queue:queue andTag:downloadIndex + 100]; //my custom initialize
downloader.delegate = self;
[queue addOperation:downloader]; //use the addOperation method
在 iOS6 中一切正常但在 iOS5 (在我的测试设备上为5.0,在我的SDK上为5.1)搞砸了,它只是没有收到任何响应或数据通过执行方法didReceiveResponse
和didReceiveData
(这两种方法没有跳入)。
超过超时后,runloop跳转到didFailWithError
方法,程序停止运行。
据我了解,这意味着runloop仍然正常运行?
我尝试打印error
,我得到的是:The request timed out
。
当我将下载实例的数量减少到2时,它会运行,但不会使用> = 3下载实例。
还有一个信息是我的网络连接确实限制了连接数。但它在iOS6中运行良好,为什么它在iOS5上不起作用?
在下载应用程序时,我仍然可以在模拟器中加载网页。
那么这是什么问题,我该如何克服这个问题呢?
提前致谢。
* 更新: * 因为有很多课程,而且问题尚未被清楚地检测到,我将在此分享整个项目。您可以直接从这里下载: DownloadingImage
答案 0 :(得分:0)
正如我刚刚发现的那样,如果你使用凭据,服务器有可能偶尔会随机拒绝它们。因此,如果您检查以确保previousFailureCount == 0,那么您很可能会遇到错误。
答案 1 :(得分:0)
我刚刚弄清楚我的问题在哪里,但并不是真的明白为什么。
在我的ImageDownloader
课程中,我设置了一个包含done
和currentRunLoop
个变量的runloop。
在main方法中,我有一个while循环来强制currentRunLoop
运行。
当我删除那些“runLoop”内容时,该应用程序在iOS6和iOS5上都能顺利运行。
所以用这些线改变整个ImageDownloader.m
然后它就可以了(我注释掉了一些无用的(比如说有害的)线):
//
// ImageLoader.m
// DownloadImagesTableView
//
// Created by Viet Ta Quoc on 6/25/13.
// Copyright (c) 2013 Viet Ta Quoc. All rights reserved.
//
#import "ImageDownloader.h"
@implementation ImageDownloader
@synthesize downloadData,delegate,queue,done,customTag;
NSRunLoop *currentRunLoop;
-(void)downloadImageWithURL:(NSString *)imageUrl queue:(NSOperationQueue*)opQueue andTag:(int)tag{
self.customTag= tag;
self.queue = opQueue;
// self.done = NO;
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:imageUrl] cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:30];
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO];
[connection start];
// currentRunLoop = [NSRunLoop currentRunLoop];
NSLog(@"Start downloading image %d...",customTag);
}
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
NSLog(@"Received response...");
downloadData=[[NSMutableData alloc] initWithLength:0];
expectedDataLength=[response expectedContentLength];
NSLog(@"Image %d size: %lld kb",customTag,[response expectedContentLength]/1024);
}
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
float receivedLenght = [data length];
receivedDataLength=(receivedDataLength+receivedLenght);
float progress=(float)receivedDataLength/(float)expectedDataLength;
[delegate updateProgess:progress andIndex:[NSIndexPath indexPathForRow:customTag-100 inSection:0]];
[self.downloadData appendData:data];
// NSLog(@"Percentage of data received of tag %d: %f %%",self.customTag,progress*100);
}
-(void)connectionDidFinishLoading:(NSURLConnection *)connection{
[delegate finishedDownloadingImage:downloadData andTag:customTag];
// done = YES;
}
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
UIAlertView *alert=[[UIAlertView alloc]initWithTitle:@"Warning" message:@"Network Connection Failed?" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:nil, nil];
// NSLog(@"%@",[error debugDescription]);
NSLog(@"Connection failed! Error - %@ %@",[error localizedDescription],[[error userInfo] objectForKey:NSURLErrorFailingURLStringErrorKey]);
[alert show];
}
-(void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge{
NSLog(@"Got here *(*&(**&(*&(*&(*&(*&(*&(*&(*&(*&(*&(*&(*&(*&(*&(*&(*&(*&");
}
-(void)main{
// do{
//// NSLog(@"Running....1");
// [currentRunLoop runUntilDate:[NSDate distantFuture]];
// // [currentRunLoop run];
// } while (!done);
// [currentRunLoop runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.01]];
}
@end
谢谢你们的支持。
<强> ============================================ ====================================== 强>
P / s:对于对此问题感兴趣的任何人,我在此更新我的整个解决方案:DownloadImage_Final