異步加載圖片的原理就是 當網絡請求下來的數據中有圖片的數據,就把圖片的數據提出來 讓它自己去通過ImageDownload下載 等下載好了,在把圖片傳給View去顯示。
話不多說 上代碼
第一步 :在定義的Model類中 重新聲明一個屬性 用來顯示圖片的,在這之前 一定要引入ImageDownload的頭文件哦!!!
@property (nonatomic, retain) UIImage *pictureimage;// 用來顯示圖片的屬性
第二步:因爲是在MRC下 所以要重寫dealloc方法 別忘了!!!
- (void)dealloc
{
[_movieId release];
[_movieName release];
[_pic_url release];
// 下面是需要release的方法
[_pictureimage release];
[super dealloc];
}
第三步 當外界執行相應的KVC方法(setValuesForKeysWithDictionary)的時候 內部會執行下面的方法 所以我們要重寫這個方法 來進行圖片異步加載
- (void)setValue:(id)value forKey:(NSString *)key
{
[super setValue:value forKey:key];
if ([key isEqualToString:@"pic_url"]) {
// 使用ImageDownload裏面的初始化方法
ImageDownload *imagedownload = [ImageDownload imageDownloadWithURLStr:value];
// 這裏面的Block方法是要等圖片加載完成後執行ImageDownload裏面的方法後 纔會執行
__block MovieData *text = self;// 雙下劃線定義self 是爲了防止循環引用
imagedownload.successBlock = ^(ImageDownload *imageDownload, UIImage *image){
// 將下載好的圖片 賦值給創建的屬性
text.pictureimage = image;
};
imagedownload.errorBlock = ^(ImageDownload *imageDownload,NSError *error){
NSLog(@"error = %@",[error localizedDescription]);
};
}
}
第四步 回到ImageDownload.m文件中 圖片數據下載完成後 會執行下面的方法
// 將接收到的數據進行拼接
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
// 拼接數據
[self.receiveData appendData:data];
}
// 數據下載成功後 調用外界成功的Block方法
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
UIImage *image = [UIImage imageWithData:self.receiveData];
self.successBlock(self,image);
}
// 下載失敗後,同樣調用外界失敗的Block方法
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
self.errorBlock(self,error);
}
第五步:在View中展示下載好的圖片
- (void)configuerDataWithActivity:(MovieData *)movieDate
{
self.namelabel.text = movieDate.movieName;
// 異步加載的方式加載圖片
// 將下載好的圖片給View中的Label顯示出來
self.imagelabel.image = movieDate.pictureimage;
}
這樣 就可以實現異步圖片的加載了 但是還有一個問題 就是實際情況中 如果網速比較慢的話 下載好的圖片不能顯示出來 所以在還不是最完美的版本 ,需要引入KVO觀察者
敬請期待。。。