1

ログイン方法があります。メソッド内で NSURLConnection を使用してログインし、NSData 応答を返したいと考えています。問題は、接続が実際にデータを取得する前に NSData を返すことです。

- (NSData*)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
[responseData appendData:data]; //responseData is a global variable
NSLog(@"\nData is: %@", [[[NSString alloc] initWithData:responseData     
encoding:NSUTF8StringEncoding]autorelease]);//this works
isLoaded = YES; //isLoaded is a BOOL
}

- (NSData*)login:(NSString*)username withPwd:(NSString*)password{  
isLoaded = NO;
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request   
delegate:self];

if(connection){
    NSLog(@"Connected");
}
 while(isLoaded = NO){
[NSThread NSSleepForTimeInterval: 1]; 
}
isLoaded = NO;
return responseData;
}

プログラムは while ループでスタックしますが、while ループがなければ、プログラムはサーバーからデータを取得できます。デリゲート メソッドが変更する前に、メソッドが responseData を返すように見えるだけです。

だから私の質問は、サーバーがそれを処理した後にのみメソッドがresponseDataを返すようにするにはどうすればよいですか?

4

3 に答える 3

1

コードをリファクタリングする必要があります。

非同期呼び出しを使用している (良い) が、それを同期的に処理しようとしている (別のスレッドを使用していない場合はあまり良くない)。

非同期動作を使用するには、コールバックが必要です。ココアのやり方では、これは通常、デリゲート メソッドです (または、新しいコードのブロックになる可能性があります)。実はそれはあなたのconnection:didReceiveData. このメソッドは、リクエストを開始したデータではなく、返されたデータで機能します。そのため、通常、非同期リクエストを開始するメソッドは何も返しません。もちろん、リクエストから返されると予想されるものは返されません。

- (void)login:(NSString*)username withPwd:(NSString*)password
{  
    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
}


//Note: you cannot change the delegate method signatures, as you did (your's returns an NSData object)
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
    [self.responseData appendData:data]
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{ 
    //Now that the connection was successfully terminated, do the real work.
}

このリンゴのサンプルコードを見てください。

于 2012-05-23T21:54:46.080 に答える
1

特に指定しない限り、NSURLConnection は URL を非同期的にロードします。デリゲート コールバックを使用して、URL ダウンロードの進行状況についてデリゲートを更新します。

具体的には、NSURLConnection デリゲートの connectionDidFinishLoading: メソッドを利用します。すべてのデータがロードされると、NSURLConnection オブジェクトはこれを呼び出します。データを返すことができるのは、このメソッド内です。

データを同期的に読み込むことはできますが、UI をブロックする可能性があります。

幸運を!

于 2012-05-23T20:49:05.157 に答える
0

同期リクエストメソッドを使用できます

- (NSData*)login:(NSString*)username withPwd:(NSString*)password
{  
   NSError *error = nil;
   NSURLResponse *response = nil;

   NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]

   return responseDate;
}

ドキュメント: https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSURLConnection_Class/Reference/Reference.html#//apple_ref/occ/clm/NSURLConnection/sendSynchronousRequest:returningResponse:error :

于 2012-05-23T20:05:16.507 に答える