2009-08-17 41 views
9

Tôi khá mới phát triển iPhone và cố gắng tìm nạp 'Hình ảnh từ máy chủ' trong ứng dụng của tôi.Tải hình ảnh từ URL/máy chủ

Tôi đang sử dụng các phương pháp sau đây để làm điều này:

- (UIImage *)imageFromURLString:(NSString *)urlString 
{ 
    NSURL *url = [NSURL URLWithString:urlString]; 
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url]; 
    [request setHTTPMethod:@"GET"]; 

    NSURLResponse *response = nil; 
    NSError *error = nil; 
    NSData *result = [NSURLConnection sendSynchronousRequest:request   
    returningResponse:&response error:&error]; 
    [request release]; 
    [self handleError:error]; 
    UIImage *resultImage = [UIImage imageWithData:(NSData *)result]; 

    NSLog(@"urlString: %@",urlString); 
    return resultImage; 
} 

Chức năng này không trả lại hình ảnh mong đợi mặc dù tôi có thể nhìn thấy trong debugger rằng NSData cho đối tượng hình ảnh có một số giá trị (tính theo byte)

Mặc dù, một chức năng rất giống nhau để nhận văn bản từ các công trình máy chủ và tôi nhận được các giá trị mong đợi.

- (NSString *)jsonFromURLString:(NSString *)urlString 
{ 

    NSURL *url = [NSURL URLWithString:urlString]; 
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url]; 
    [request setHTTPMethod:@"GET"]; 

    NSURLResponse *response = nil; 
    NSError *error = nil; 
    NSData *result = [NSURLConnection sendSynchronousRequest:request 
    returningResponse:&response error:&error]; 
    [request release]; 
    [self handleError:error]; 
    NSString *resultString = [[NSString alloc] initWithData:result 
    encoding:NSUTF8StringEncoding]; 

    return [resultString autorelease]; 
} 

Phương pháp này hoạt động tốt.

Ai đó có thể giúp tôi hiểu tại sao tôi không nhận được Hình ảnh từ máy chủ?

Cảm ơn

Trả lời

1

Nguyên nhân có thể nhất là bạn không thực sự tìm nạp hình ảnh hoặc bạn đang tìm nạp hình ảnh mà iPhone không thể giải mã được. Tôi sẽ bắt đầu bằng cách kiểm tra loại MIME của kết quả ([response MIMEType]) và chắc chắn rằng đó là những gì bạn đang mong đợi và không thực sự là một chuỗi ví dụ. Sau đó, hãy đảm bảo rằng loại của bạn là một trong các loại UIImage có thể xử lý: tiff, jpeg, gif, png, bmp, ico, cur, xbm.

1

Nó rất có thể là những gì máy chủ của bạn đang quay trở lại không thực sự là dữ liệu hình ảnh và bạn có thể chỉ dán url vào trình duyệt và xem bạn có nhận được hình ảnh hay không. Có vẻ như không có gì sai với mã ngoại trừ việc thiếu kiểm tra lỗi.

Khi bạn chuyển NSData không phải hình ảnh vào một tin nhắn + imageWithData, bạn sẽ nhận được không. Có lẽ bạn nên kiểm tra điều đó.

29

Nếu tất cả những gì bạn đang cố gắng làm là lấy hình ảnh từ máy chủ web qua URL có cách dễ dàng hơn.

Đây là những gì tôi sử dụng:

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

Và nếu bạn muốn sử dụng nó trên một cái nhìn hình ảnh chỉ làm như sau:

// Let's assume the picture is an instantiated UIImageView 
[picture setImage: myImage]; 
[myImage release]; 

Tôi chắc chắn có những lý do tại sao một người có thể không muốn sử dụng cách tiếp cận này, nhưng tôi sẽ bắt đầu với điều này và xem nó sẽ làm những gì bạn cần nó.

+1

Chừng nào bạn đặt nó trong một chủ đề riêng biệt để giao diện người dùng không bị khóa . – Domness

+0

Tại sao bạn phát hành myImage? Bạn chưa phân bổ nó –

1

Có thể nó không liên quan trực tiếp đến câu hỏi của bạn, nhưng tôi muốn chỉ ra rằng việc kiểm tra lỗi của bạn ở đây có vấn đề tiềm ẩn. Các phương thức như thế này có tham số tham chiếu đến một số NSError thường không xác định những gì chúng trả về thành công. Nói cách khác, bạn nên kiểm tra các phương pháp trở về giá trị đầu tiên, và chỉ truy cập con trỏ lỗi nếu phương pháp này thất bại:

NSString *resultString = nil; 
NSData *result = [NSURLConnection sendSynchronousRequest:request 
             returningResponse:&response 
                error:&error]; 
[request release]; 

if(result) { 
    resultString = [[NSString alloc] initWithData:result 
             encoding:NSUTF8StringEncoding]; 
} 
else { 
    [self handleError:error]; 
} 
Các vấn đề liên quan