2009-05-31 37 views
45

Tôi đang cố gắng để có được một hình ảnh từ một URL và nó không có vẻ là làm việc cho tôi. Ai đó có thể chỉ cho tôi đi đúng hướng?Lấy hình ảnh từ mục tiêu URL C

Đây là mã của tôi:

NSURL *url = [NSURL URLWithString:@"http://myurl/mypic.jpg"]; 

NSString *newIMAGE = [[NSString alloc] initWithContentsOfURL:url 
             encoding:NSUTF8StringEncoding error:nil]; 

cell.image = [UIImage imageNamed:newIMAGE]; 

Khi tôi gỡ lỗi chuỗi newIMAGE là con số không nên cái gì không được làm việc ở đó.

Trả lời

148

Những gì bạn muốn là để có được các dữ liệu hình ảnh, sau đó khởi tạo một UIImage sử dụng dữ liệu đó:

NSData * imageData = [[NSData alloc] initWithContentsOfURL: [NSURL URLWithString: @"http://myurl/mypic.jpg"]]; 
cell.image = [UIImage imageWithData: imageData]; 
[imageData release]; 

Theo yêu cầu, đây là một phiên bản không đồng bộ:

dispatch_async(dispatch_get_global_queue(0,0), ^{ 
    NSData * data = [[NSData alloc] initWithContentsOfURL: [NSURL URLWithString: @"http://myurl/mypic.jpg"]]; 
    if (data == nil) 
     return; 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     // WARNING: is the cell still using the same data by this point?? 
     cell.image = [UIImage imageWithData: data]; 
    }); 
    [data release]; 
}); 
+0

Cảm ơn. Điều đó làm việc – TheGambler

+1

điều này là đồng bộ, bạn có thể vui lòng thêm một mã để tải xuống dưới nền, vì, nó bloques chuỗi ui – Houcine

+1

Một vài vấn đề: 1. Bạn có nhận xét về cách đảm bảo ô vẫn hiển thị. Bạn làm điều đó với 'UITableViewCell * updateCell = [tableView cellForRowAtIndexPath: indexPath];' theo sau bởi 'if (updateCell) ...' (và hiển nhiên, sử dụng 'updateCell' này thay vì' ô' ban đầu để cập nhật ' 2. Hãy chắc chắn, nếu làm không đồng bộ, để khởi tạo thuộc tính 'image' cho' imageView' của bạn trước khi bạn bắt đầu quá trình truy xuất không đồng bộ; 3. Bạn thực sự nên lưu vào bộ nhớ đệm, vì vậy nó không phải truy xuất lại mỗi khi bạn cuộn lại hình ảnh đã tải trước đó – Rob

4

Ok có một vài điều sai ở đây:

  1. Việc quy đổi từ URL (url) để NSString (newImage) là không chính xác, những gì các mã thực sự không có được cố gắng tải các nội dung của "http://myurl/mypic.jpg "vào NSString.

  2. Phương thức -imageNamed nhận một chuỗi là đường dẫn của tệp cục bộ chứ không phải URL làm đối số.

Bạn cần phải sử dụng một đối tượng NSData như một trung gian, như trong ví dụ này: http://blogs.oreilly.com/digitalmedia/2008/02/creating-an-uiimage-from-a-url.html

3

câu trả lời được chấp nhận phiên bản không đồng bộ làm việc rất chậm trong mã của tôi. một cách tiếp cận sử dụng NSOperation làm việc nhanh hơn năm ánh sáng. mã được cung cấp bởi Joe Masilotti ->objective - C : Loading image from URL? (và dán dưới đây):

-(void) someMethod { 
    // set placeholder image 
    UIImage* memberPhoto = [UIImage imageNamed:@"place_holder_image.png"]; 

    // retrieve image for cell in using NSOperation 
    NSURL *url = [NSURL URLWithString:group.photo_link[indexPath.row]]; 
    [self loadImage:url]; 
} 

- (void)loadImage:(NSURL *)imageURL 
{ 
    NSOperationQueue *queue = [NSOperationQueue new]; 
    NSInvocationOperation *operation = [[NSInvocationOperation alloc] 
             initWithTarget:self 
             selector:@selector(requestRemoteImage:) 
             object:imageURL]; 
    [queue addOperation:operation]; 
} 

- (void)requestRemoteImage:(NSURL *)imageURL 
{ 
    NSData *imageData = [[NSData alloc] initWithContentsOfURL:imageURL]; 
    UIImage *image = [[UIImage alloc] initWithData:imageData]; 

    [self performSelectorOnMainThread:@selector(placeImageInUI:) withObject:image waitUntilDone:YES]; 
} 

- (void)placeImageInUI:(UIImage *)image 
{ 
    [self.memberPhotoImage setImage:image]; 
} 
0

Trong Swift 3 và 4

let theURL = URL(string:"https://exampleURL.com") 
let imagedData = NSData(contentsOf: theURL!)! 
let theImage = UIImage(data: imagedData as Data) 
cell.theImageView.image = theImage 

này sẽ được thực hiện trong các chủ đề chính.

Và để thực hiện như nhau trong không đồng bộ chủ đề/nền

DispatchQueue.main.async(){ 
     let theURL = URL(string:"https://exampleURL.com") 
     let imagedData = NSData(contentsOf: theURL!)! 
     let theImage = UIImage(data: imagedData as Data) 
    } 
    cell.theImageView.image = theImage 
Các vấn đề liên quan