1

このようなhttpController.hのいくつかのコード:

@interface httpController:NSObject{
  ...
  NSMutableData *receivedData;
}
@property (nonatomic,retain) NSMutableData *receivedData;

httpController.mファイルのいくつかのコードは次のようになります。

@implementation httpController
@synthesize receivedData;
...
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
  [receivedData setLength:0];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data               
{
  if (!receivedData) {
      receivedData = [[NSMutableData alloc] init];
  }
  [receivedData appendData:data];  
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {

}

次に、main.mファイルのreceivedDataを次のように使用します。

int main(int argc, const char *argv[])
{
   HttpController *httpController = [[HttpController alloc] init];
   NSURLRequest *request = ...;
   NSURLConnection *connetion = ...;
   if(connection)
   {
     NSMutableData *_receviedData = httpController.receivedData;
     NSString * dataString = [[[NSString alloc] initWithData:_receviedData encoding:NSUTF8StringEncoding] autorelease]; 
     NSLog(@"%@",dataString);
   }
   [[NSRunLoop currentRunLoop] run];
}

しかし、main()関数では、_receivedDataの値が空であり、出力されていることに注意してください。誰でも教えてくれます何が悪いの?

4

1 に答える 1

1

+connectionWithRequest:delegate:非同期で実行されます。戻る前に接続を終了していないように見えるため、データが表示されません。+sendSynchronousRequest:returningResponse:error:接続が完了するまでスレッドがブロックされるため、代わりに試してください。

どちらを使用する場合でも、HttpController/delegate は必要ありません+sendSynchronousRequest:returningResponse:error:。方法は次のとおりです。

int main(int argc, const char *argv[])
{
    NSURL           *url        = [NSURL URLWithString:@"http://www.yahoo.com/"];
    NSURLRequest    *request    = [NSURLRequest requestWithURL:url];
    NSURLResponse   *response   = nil;
    NSError         *error      = nil;

    // This blocks "this" thread until it's done.
    NSData          *data       = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

    if (!data)
    {
        NSLog(@"Error: %@", error);
    }
    else
    {
        NSString *dataString = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease];
        NSLog(@"%@", dataString);
    }
}

スレッドをブロックしたくない場合+connectionWithRequest:delegate:は、行く方法です。ただし、コードを別の方法で記述する必要があり、 docs を読む必要があります

于 2012-04-24T14:51:58.430 に答える