使用NSURLConnection时图像为空白,但使用dataWithContentsOfURL时图像不为空

时间:2011-06-28 19:38:23

标签: ios iphone asynchronous nsurlconnection

当我异步使用NSURLConnection尝试获取带有我的图像数据的NSData时,图像会显示为空白,但当我同步使用dataWithContentsOfURL时,我没有任何问题,我正确地得到了图像数据。有什么理由说我的异步方法会失败吗?

这有效:

NSData *data = [NSData dataWithContentsOfURL: url];
NSLog(@"TEST %@", data);
UIImage *map = [UIImage imageWithData:data];
mapView.image = map;

这不是:

//
//  MapHttpRequest.m
//  GTWeb
//
//  Created by Graphic Technologies on 6/21/11. 
//  Copyright 2011 __MyCompanyName__. All rights reserved.
//

#import "MapHttpRequest.h"

@implementation MapHttpRequest
@synthesize receivedData;
@synthesize dataString;
@synthesize vc;

- (void)request:(NSString *)url fromView:(UIViewController *) theVC
{
vc = theVC;
// Create the request.
NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:url]
                                          cachePolicy:NSURLRequestUseProtocolCachePolicy
                                      timeoutInterval:60.0];
NSLog(@"URL: %@", url);
// create the connection with the request
// and start loading the data
NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
if (theConnection) {
    // Create the NSMutableData to hold the received data.
    // receivedData is an instance variable declared elsewhere.
    receivedData = [[NSMutableData data] retain];
} else {
    // Inform the user that the connection failed.
}
}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse             *)response
{
// This method is called when the server has determined that it
// has enough information to create the NSURLResponse.

// It can be called multiple times, for example in the case of a
// redirect, so each time we reset the data.

// receivedData is an instance variable declared elsewhere.
[receivedData setLength:0];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
// Append the new data to receivedData.
// receivedData is an instance variable declared elsewhere.
[receivedData appendData:data];
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
// release the connection, and the data object
[connection release];
// receivedData is declared as a method instance elsewhere
[receivedData release];

// inform the user
NSLog(@"Connection failed! Error - %@ %@",
      [error localizedDescription],
      [[error userInfo] objectForKey:NSURLErrorFailingURLStringErrorKey]);
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
// do something with the data
// receivedData is declared as a method instance elsewhere

[vc mapImageConnectionFinished:receivedData];

// release the connection, and the data object
[dataString release];
[connection release];
[receivedData release];
}

@end

3 个答案:

答案 0 :(得分:0)

看起来你开始查看http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/URLLoadingSystem/Tasks/UsingNSURLConnection.html上的指南,但还没看完它:)

您需要实施将收到有关所接收数据信息的方法。

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data

所有这些都在我提供的链接中描述。

答案 1 :(得分:0)

根据您的代码,您没有安排连接运行:

[connection scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
[connection start];

您是否在代理人的回调中添加了跟踪以确保他们被调用?

答案 2 :(得分:0)

原来它给了我一个不好的请求,因为有一个看不见的回车或空白区域。修剪它:

url = [url stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

解决了我的问题。