2011-10-08 39 views
46

一個URL創建一個UIImage要創建一個圖像文件的UIImage的,我用下面的代碼:與iOS的

UIImage *aImage = [[UIImage imageNamed:@"demo.jpg"]autorelease]; 

如果我想用URL http://example.com/demo.jpg,該怎麼做創建的UIImage ?

由於

UPDATE

enter image description here

+1

可能想看看這個項目:https://github.com/rs/SDWebImage – Intentss

回答

147

這是一個三步過程。首先,您將創建一個NSURL對象來保存我們嘗試訪問的URL。我們將提供此URL到NSData類的方法,+dataWithContentsOfURL:以通過網絡獲取作爲原始數據的圖像,然後使用+imageWithData:類方法UIImage將數據轉換爲圖像。

NSURL *imageURL = [NSURL URLWithString:@"http://example.com/demo.jpg"]; 
NSData *imageData = [NSData dataWithContentsOfURL:imageURL]; 
UIImage *image = [UIImage imageWithData:imageData]; 

請注意+dataWithContentsOfURL:執行同步網絡請求。如果你在主線程上運行它,它會阻塞UI,直到從網絡接收到圖像數據。最佳做法是在後臺線程上運行任何網絡代碼。如果您的目標OS 4.0及以上版本,你可以做這樣的事情......

NSURL *imageURL = [NSURL URLWithString:@"http://example.com/demo.jpg"]; 

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ 
    NSData *imageData = [NSData dataWithContentsOfURL:imageURL]; 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     // Update the UI 
     self.imageView.image = [UIImage imageWithData:imageData]; 
    }); 
}); 
+1

感謝您的建議,但我在將代碼放入課程時收到錯誤消息,請參閱我的更新 –

+0

修正了錯字。第一個dispatch_async()調用中有一個額外的右括號。 –

+0

非常感謝您的回答。 :-) – kernix

7

這是同樣的代碼可能看起來像雨燕什麼:

let image_url = NSURL("http://i.imgur.com/3yY2qdu.jpg") 

let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT 
dispatch_async(dispatch_get_global_queue(priority, 0)) { 
    // do some task 
    let image_data = NSData(contentsOfURL: image_url!) 

    dispatch_async(dispatch_get_main_queue()) { 
     // update some UI 
     let image = UIImage(data: image_data!) 
     self.imageView.image = image 
    } 
} 
+0

在Xcode 9中,異步調度的首選Swift語法是'DispatchQueue.global(qos:.default).async {// block}' – atineoSE

0

對於任何人都希望從加載圖像網下圖書館可能會有所幫助:

https://github.com/rs/SDWebImage

這是一個UIImageView類別負責處理異步加載和圖像緩存的URL。