2013-05-03 43 views
3

我有一個NSMutableArray與一些圖像網址。圖像大小在12KB到6MB之間。我使用AsycImageView類和工具,但是當大圖像下載應用程序崩潰時,我在該類中爲maxsize提供了6 * 1024 * 1024(6MB),將時間間隔增加到了180.0秒,但沒有用處。我收到一個錯誤「收到內存警告」,當應用程序崩潰自動連接從設備中刪除,但在模擬器中沒有崩潰。如何從服務器異步檢索圖像

回答

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

使用GCDlazy 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 
     }); 
}); 
+0

謝謝你,王子我在哪裏可以寫這個代碼 – Ravi 2013-05-03 06:59:20

+0

當我使用這段代碼我得到了錯誤「預期的表達式」在UIImage * image = [UIImage imageWithData:data] @Prine – Ravi 2013-05-03 07:25:04

+0

檢查現在編輯答案...讓我知道..... – 2013-05-03 07:55:19

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

如果imageData是零怎麼辦? – 2013-05-03 06:33:40

+0

@王子,好點。 – x4h1d 2013-05-03 06:36:25

+0

謝謝你x4h1d,我在哪裏可以把這段代碼,iam混淆了AsycImageView類或我的類 – Ravi 2013-05-03 06:57:35

0

我會建議替代API SDWebImage下降它提供的UIImageView一類用於從網絡遠程來支持圖片。你也可以有一個佔位符圖像,直到圖像下載異步 。它易於使用,並節省了大量的工作

0

你的問題似乎更多的是內存使用問題,而不是性能問題。

如果你真的想異步下載圖片,我建議你使用AFNetworking的,它已經過全面測試並且維護得很好。

但是,在這裏,您遇到了設備上的內存警告(顯然,它比您的Mac上運行的模擬器的內存少得多)。

所以我想先靜分析儀使用方法:

enter image description here

,看是否漏氣存在,然後運行Leaks Instrument跟蹤下來。

希望這會有所幫助。

相關問題