在iOS5中创建许多下载对象时,NSURLConnection不会接收数据

时间:2013-07-25 03:01:08

标签: iphone ios objective-c ios5 nsurlconnection

我已经在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)搞砸了,它只是没有收到任何响应或数据通过执行方法didReceiveResponsedidReceiveData(这两种方法没有跳入)。

超过超时后,runloop跳转到didFailWithError方法,程序停止运行。

据我了解,这意味着runloop仍然正常运行?

我尝试打印error,我得到的是:The request timed out

当我将下载实例的数量减少到2时,它会运行,但不会使用> = 3下载实例。

还有一个信息是我的网络连接确实限制了连接数。但它在iOS6中运行良好,为什么它在iOS5上不起作用?

在下载应用程序时,我仍然可以在模拟器中加载网页。

那么这是什么问题,我该如何克服这个问题呢?

提前致谢。

* 更新: * 因为有很多课程,而且问题尚未被清楚地检测到,我将在此分享整个项目。您可以直接从这里下载: DownloadingImage

2 个答案:

答案 0 :(得分:0)

正如我刚刚发现的那样,如果你使用凭据,服务器有可能偶尔会随机拒绝它们。因此,如果您检查以确保previousFailureCount == 0,那么您很可能会遇到错误。

答案 1 :(得分:0)

我刚刚弄清楚我的问题在哪里,但并不是真的明白为什么。

在我的ImageDownloader课程中,我设置了一个包含donecurrentRunLoop个变量的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