1

我的应用程序正在使用网络连接,如下所示:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{ 
    .
    .
    .
    receivedData = [[NSMutableData alloc] init];
}

.

-(void) dataFromWeb{
request = [[NSURLRequest alloc] initWithURL: url];
theConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self];

if (theConnection) {
    receivedData = [[NSMutableData data] retain];
    NSLog(@"** NSURL request sent !");
} else {

    NSLog(@"Connection failed");
}

.

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    .
    .
    .
    [theConnection release];
    [request release];

// Here - using receivedData
[receivedData release];
}

.

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
      [receivedData setLength:0];
}

.

- (void)connection:(NSURLConnection *)connection
  didFailWithError:(NSError *)error
{
    [theConnection release];
    [request release];
    [receivedData release];
}

.

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    [receivedData appendData:data];
}

. 在应用程序的后面是这个片段(onButtonPressed):

if (theConnection) {
    // Create the NSMutableData to hold the received data.
    // receivedData is an instance variable declared elsewhere.
    receivedData = [[NSMutableData data] retain];
} else {
    NSLog(@"Connection failed");
}

我想了解的是:

  • 如果我想同时创建另一个 URLRequest,我是否需要使用不同的连接,以便来自网络的数据在检索时不会混淆?

  • 在这段代码中,发生的情况是有时代码会在函数didReceiveResponse() setLength:0的行上崩溃,当应用程序崩溃时我看到receivedData=nil我应该将行更改为

    if(receivedData!=nil)
       [receivedData setLength:0];
    else
       receivedData = [[NSMutableData data] retain];
    
  • 我不太确定这条线在做什么receivedData = [[NSMutableData data] retain];

4

2 回答 2

1

我认为处理 2 个连接的最简单方法是复制NSMutableData. 我以这种方式使用,它对我来说非常有效。

拳头你在你想要第二个连接的地方这样做:

receivedData2 = [[NSMutableData alloc] init];

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response  
{  
    if (receivedData2) {
        [receivedData2 setLength:0];  
    }
    else 
    {
        [receivedData setLength:0];  
    }
}  

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data  
{  
    if (receivedData2) {
        [receivedData2 appendData:data];  
    }
    else {    
        [receivedData appendData:data]; 
    }
} 

然后,在您要求 receivedData2 或 receivedData 的方法中

当你使用它时不要忘记做:

receivedData2=nil;
[receivedData2 setLength:0];
于 2012-11-22T10:46:43.947 回答
0
  1. 你当然需要一个不同的NSURLConnection.
  2. 你可以这样做,但最好找出为什么它是 nil,因为它不应该。
  3. 它分配一个空NSMutableData对象。但这对我来说似乎是丑陋的代码,因为您创建了一个自动释放的对象并保留它。最好写[NSMutableData new][[NSMutableData alloc] init]
于 2012-11-22T10:49:27.560 回答