objective-c - 什么是异步图片下载以及如何下载太多图片?

标签 objective-c image asynchronous

我有太多图片无法从网上下载到 iPhone 中?如何使用异步图像下载构建应用程序?

最佳答案

最常见和简单的方法是将 NSURLConnection 与异步请求一起使用。与请求集委托(delegate)创建连接,当接收到下一个数据 block 、完成加载或失败时,它会在后台调用委托(delegate)方法开始加载数据。当加载第一个对象时,从下一个开始,依此类推。 这是稍微简化的工作代码:

- (id)init...{
//...   
    requestData = [[NSMutableData alloc] initWithCapacity:1000000];
    myImages = [[NSMutableArray alloc] initWithCapacity:100];
    myImagesAddresses = [[NSMutableArray alloc] initWithCapacity:100];
    [myImagesAddresses addObject:@"http://mysite.com/image1"];
    [myImagesAddresses addObject:@"http://mysite.com/image2"];
    //...
    [self loadNextImage];
//...   
}

-(void)loadNextImage{
    if ([myImagesAddresses count]){
        NSURL * imageURL = [NSURL URLWithString:[myImagesAddresses lastObject]];
        NSURLRequest * myRequest = [NSURLRequest requestWithURL:imageURL];
        [[NSURLConnection alloc] initWithRequest:myRequest delegate:self];
        NSLog(@"start load URL:%@", imageURL);
    }
    else{
        NSLog(@"No more images to load");
           // all images are ready to use!
    }
}

// connection delegate methods
- (void)connection:(NSURLConnection*)connection didReceiveData:(NSData*)data{
    NSLog(@"more data...");
    [requestData appendData:data];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)inConnection{ 
    [myImages addObject:[UIImage imageWithData:[NSData dataWithData:requestData]]]; 
    [inConnection release];
    inConnection = nil;
    NSLog(@"Image from:%@ loaded",[myImagesAddresses lastObject]);
    [myImagesAddresses removeLastObject];
    [self loadNextImage];
}

- (void)connection:(NSURLConnection *) inConnection didFailWithError:(NSError *)error{
    [inConnection release];
    inConnection = nil;
    NSLog(@"Image from:%@ not loaded",[myImagesAddresses lastObject]);
    [myImagesAddresses removeLastObject];
    [self loadNextImage];
}

关于objective-c - 什么是异步图片下载以及如何下载太多图片?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2408010/

相关文章:

javascript - 尝试创建一个Java脚本函数,当按下按钮时会出现图像

javascript - Nodejs 并行异步调用,但有优先权

javascript - Node.js 异步 forEach : thread-safe?

iphone - 从 viewController 内的 tableview 推送 viewController 不起作用

ios - 过滤对象的 NSArray 以具有唯一的属性对象

iphone - 如何格式化字符串中的日期?

objective-c - 在 Cocoa Objective-C 中创建模态对话框或窗口?

css - 从桌面更改为移动时如何调整(裁剪)图像

html - 并排显示三个图像

javascript - 获取不返回 Promise 的函数的返回值