什么是异步图像下载?如何下载太多图像?

Mad*_*han 2 asynchronous image objective-c

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

Vla*_*mir 11

最常见也是最简单的方法是使用带有异步请求的NSURLConnection.创建与请求集委托的连接,并在接收下一个数据块,完成加载或失败时,在后台调用委托方法中启动加载数据.加载第一个对象时,启动下一个,依此类推.这是略微简化的工作代码:

- (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];
}
Run Code Online (Sandbox Code Playgroud)