2011-10-08 24 views

Trả lời

147

Đây là một quá trình ba bước. Trước tiên, bạn sẽ tạo đối tượng NSURL để giữ URL mà chúng tôi đang cố gắng truy cập. Chúng tôi sẽ cung cấp URL này cho phương thức lớp học NSData, +dataWithContentsOfURL: để lấy hình ảnh qua mạng dưới dạng dữ liệu thô, sau đó sử dụng phương thức lớp +imageWithData: trên UIImage để chuyển đổi dữ liệu thành hình ảnh.

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

Xin lưu ý rằng +dataWithContentsOfURL: thực hiện yêu cầu mạng đồng bộ. Nếu bạn chạy nó trên luồng chính, nó sẽ chặn giao diện người dùng cho đến khi nhận được dữ liệu hình ảnh từ mạng. Thực hành tốt nhất là chạy bất kỳ mã mạng nào trên một chuỗi nền. Nếu bạn đang nhắm mục tiêu OS 4.0 + bạn có thể làm một cái gì đó như thế này ...

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

Cảm ơn bạn đã đề xuất, nhưng tôi nhận được thông báo lỗi khi đặt mã trong một lớp, vui lòng xem UPDATE –

+0

Sửa lỗi đánh máy của tôi . Có một dấu ngoặc đóng thêm trong cuộc gọi dispatch_async() đầu tiên. –

+0

Cảm ơn bạn rất nhiều vì câu trả lời tuyệt vời. :-) – kernix

7

Đây là những gì cùng mã có thể trông giống như trong Swift:

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

Tại Xcode 9, cú pháp Swift ưa thích cho công văn không đồng bộ sẽ là 'DispatchQueue.global (qos: .default) .async {// block}' – atineoSE

0

Đối với bất cứ ai tìm cách để tải hình ảnh từ web thư viện sau đây có thể hữu ích:

https://github.com/rs/SDWebImage

đó là một loại UIImageView mà xử lý tải async và bộ nhớ đệm hình ảnh từ url.

Các vấn đề liên quan