0

クラスには次のメソッドがあります。

-(IBAction)loginToAccount:(id)sender {
 // Display the network activity status indicator
 [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

 // Show the load indicator
 [self.loadIndicator startAnimating];
 self.loadIndicator.hidden = NO;
 self.loadLabel.hidden = NO;

 [usernameTextField resignFirstResponder];
 [passwordTextField resignFirstResponder];

 [self CheckLoginCredentials];
}

-(void)CheckLoginCredentials {
 NSString *APIURL = [[NSString alloc] initWithFormat:@"http://mysite.com/xml.xml"];
 NSURL *url = [[NSURL alloc] initWithString:APIURL];
 NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:url];
 [APIURL release];
 [url release];

 [xmlParser setDelegate:self];
 [xmlParser parse];
}

コメントする[self CheckLoginCredentials]と、loadIndicatorがアニメーション化されて表示されますが、コメントを外すと[self CheckLoginCredentials]、loadIndicatorが表示されず、機能しませんusernameTextField/passwordTextField resignFirstResponder

私は何が間違っているのですか?ありがとう!

4

1 に答える 1

2

これ-initWithContentsOfURL:は同期URL接続であるため、完了するまで実行中のスレッドをブロックします。

このため、実行中のスレッドにアクティブな実行ループがある必要があるため、進行状況インジケーターは表示されません。メインスレッドで同期URL接続を使用すると、そのスレッドのUIがブロックされるため、進行状況インジケーターは表示されません。

これを行う正しい方法は、NSURLConnectionを使用することです。

+ (NSURLConnection *)connectionWithRequest:(NSURLRequest *)request delegate:(id)delegate

APIリクエストをカプセル化するNSURLRequestオブジェクトを作成し、それをNSURLConnectionのそのメソッドに渡すだけです。

次に、デリゲートコールバックを実装して、データを元に戻します。

この方法の利点は、これらすべてが別のスレッドで実行されて処理されるため、UIがブロックされないことです。

于 2009-10-19T13:48:28.710 に答える