我有一個NSMutableArray
與一些圖像網址。圖像大小在12KB到6MB之間。我使用AsycImageView
類和工具,但是當大圖像下載應用程序崩潰時,我在該類中爲maxsize提供了6 * 1024 * 1024(6MB),將時間間隔增加到了180.0秒,但沒有用處。我收到一個錯誤「收到內存警告」,當應用程序崩潰自動連接從設備中刪除,但在模擬器中沒有崩潰。如何從服務器異步檢索圖像
3
A
回答
3
你可以使用multiThreading
來做到這一點。下面是一個代碼
- (UIImageView *)getImageFromURL:(NSDictionary *)dict
{
#ifdef DEBUG
NSLog(@"dict:%@", dict);
#endif
UIImageView *_cellImage = nil;
_cellImage = ((UIImageView *)[dict objectForKey:@"image"]);
NSString *strURL = [dict objectForKey:@"imageurl"]);
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:strURL]];
#ifdef DEBUG
NSLog(@"%i", data.length);
#endif
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *dataFilePath = [NSString stringWithFormat:@"%@.png", [documentsDirectory stringByAppendingPathComponent:[dict objectForKey:@"imageid"]]];
if (data) // i.e. file exist on the server
{
[data writeToFile:dataFilePath atomically:YES];
_cellImage.image = [UIImage imageWithContentsOfFile:dataFilePath];
}
else // otherwise show a default image.
{
_cellImage.image = [UIImage imageNamed:@"nouser.jpg"];
}
return _cellImage;
}
而且在cellForRowAtIndexPath
這樣調用這個方法:
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:imageURL, @"imageurl", self.imgPhoto, @"image", imageid, @"imageid", nil];
[NSThread detachNewThreadSelector:@selector(getImageFromURL:) toTarget:self withObject:dict];
的代碼將開始在多個線程中獲取圖像,並會在本地保存圖像文件的文件夾。如果圖像已經以相同的名字存在,圖像將不會再次下載。希望這有助於
3
使用GCD
爲lazy loading
。
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
dispatch_async(queue, ^{
NSString *strURL = url here;
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:strURL]];
UIImage *image = nil;
if(data)
image = [UIImage imageWithData:data];
dispatch_sync(dispatch_get_main_queue(), ^{
//now use image in image View or anywhere according to your requirement.
if(image)
yourImgView = image
});
});
1
您可以使用GCD異步下載圖像。使用下面的代碼,
__block NSData *imageData;
dispatch_queue_t myQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, NULL);
dispatch_async(myQueue, ^{
//load url image into NSData
imageData = [NSData dataWithContentsOfURL: your_image_URL];
if(imageData) {
dispatch_sync(dispatch_get_main_queue(), ^{
//convert data into image after completion
UIImage *img = [UIImage imageWithData:imageData];
//do what you want to do with your image
});
} else {
NSLog(@"image not found at %@", your_image_URL);
}
});
dispatch_release(myQueue);
如需進一步信息,請參閱dispatch_queue_t
0
我會建議替代API SDWebImage下降它提供的UIImageView一類用於從網絡遠程來支持圖片。你也可以有一個佔位符圖像,直到圖像下載異步 。它易於使用,並節省了大量的工作
0
你的問題似乎更多的是內存使用問題,而不是性能問題。
如果你真的想異步下載圖片,我建議你使用AFNetworking的,它已經過全面測試並且維護得很好。
但是,在這裏,您遇到了設備上的內存警告(顯然,它比您的Mac上運行的模擬器的內存少得多)。
所以我想先靜分析儀使用方法:
,看是否漏氣存在,然後運行Leaks Instrument跟蹤下來。
希望這會有所幫助。
相關問題
- 1. 如何從網絡服務器異步下載圖像
- 2. 如何從服務器異步獲取圖像
- 3. 如何從Web服務器url路徑檢索圖像到angularJS
- 4. 如何使用AFImageRequestOperation從Web服務器API檢索圖像?
- 5. 圖像庫和從服務器檢索圖像
- 6. JavaScript以異步加載圖像從服務器
- 7. android:異步下載從ftp服務器的圖像列表
- 8. 異步下載圖像從服務器使用pagecontrol
- 9. 在Android中的ListView異步顯示圖像從服務器?
- 10. 從iPhone中的服務器UITableView異步顯示圖像
- 11. 如何從服務器檢索數據
- 12. 空指針異常 - 試圖從PHPMYADMIN服務器檢索數據
- 13. 從服務器檢索
- 14. 如何檢索服務器中的圖像資源位置
- 15. 如何從OData服務中檢索圖像?
- 16. 從組件中的異步服務中檢索數據
- 17. 無法從雲數據服務器檢索圖像
- 18. Android - 從數據庫服務器檢索圖像和數據
- 19. 使用AJAX從跨源服務器檢索圖像
- 20. 應用引擎服務器從blobstore檢索圖像
- 21. 從角度上傳和檢索圖像到php服務器
- 22. 通過客戶端從服務器檢索圖像
- 23. Apache Httppost從服務器Java中檢索圖像
- 24. 從服務器檢索圖像的可能方法
- 25. 無法從元數據服務器檢索圖像名稱
- 26. 索引服務設計 - 同步/異步
- 27. WCF服務 - 異步如何?
- 28. 如何從服務器獲取圖像
- 29. 如何使用ajax從服務器端檢索地圖對象
- 30. 如何從服務器檢索數據到客戶端視圖
謝謝你,王子我在哪裏可以寫這個代碼 – Ravi 2013-05-03 06:59:20
當我使用這段代碼我得到了錯誤「預期的表達式」在UIImage * image = [UIImage imageWithData:data] @Prine – Ravi 2013-05-03 07:25:04
檢查現在編輯答案...讓我知道..... – 2013-05-03 07:55:19