1

Chilkatライブラリを使用してFTPサーバーからディレクトリファイルリストを取得しようとしています。この場合、プロセスの実行中にUIActivityIndi​​catorViewをアニメーション化する必要があります。ただし、問題は、UIActivityIndi​​catorViewがアニメーションを開始しないことです。私が使用するコードは次のとおりです。

[self.activityIndicator startAnimating];
[selfgetListFromPath:ftpPath withConnection:ftpConnect];
[self.activityIndicator stopAnimating];

activityIndi​​catorはのオブジェクトでありUIActivityIndicatorViewftpPathFTPサーバーのファイルパスのNSStringであり、getListFromPathChilkatアルゴリズムを使用してFTPサーバーからリストを取得するためのメソッドでftpConnectあり、FTP接続クラスのオブジェクトです。

関数を呼び出す前にNSRunLoopを使用しようとしたgetListFromPathので、コードを次のように変更しました。

[self.activityIndicator startAnimating];

BOOL waitingOnProcessing = YES;
NSRunLoop *currentRunLoop = [NSRunLoop currentRunLoop];
while (waitingOnProcessing && [currentRunLoop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]) {

}

[self getListFromPath:ftpPath withConnection:ftpConnect];
[self.activityIndicator stopAnimating];

これはactivityIndicatorアニメーションになりますが、getListFromPath決して解雇されません。試用後、コードを次のように変更することにしました。

[self.activityIndicator startAnimating];

    BOOL waitingOnProcessing = YES;
    NSRunLoop *currentRunLoop = [NSRunLoop currentRunLoop];
    while (waitingOnProcessing && [currentRunLoop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]) {
        waitingOnProcessing = NO;       
    }

    [self getListFromPath:ftpPath withConnection:ftpConnect];
    [self.activityIndicator stopAnimating];

それはactivityIndicatorアニメーションを作成し、また関数を起動しgetListFromPathます。しかし、私はこのコードに疑問があります、私はこのコードで正しいですか?または多分NSRunLoopを使用するための悪い習慣がありますか?誰か教えてもらえますか

ありがとうございました

4

2 に答える 2

0

Chilkatライブラリはわかりませんが、ftpサーバーから回答を受け取ったことを伝える方法が必要です。取得したら、NSNotificationまたはプロトコルを使用して、回答を取得したことをViewControllerに通知する必要があります。それが起こったら、スピナーを停止します。

于 2011-07-12T09:38:44.807 に答える
0

このコードは「ブラックボックス」のように実行されます。

[self.activityIndicator startAnimating];
[self getListFromPath:ftpPath];
[self.activityIndicator stopAnimating];

そのため、メソッドが戻ったときにUIの更新が発生し、更新は表示されません。

あなたがする必要があるのはあなたの活動インジケーターをstartAnimatingし、そしてgetListFromPath別のスレッドであなたを始めることです。そのメソッドが終了すると、メインスレッドをコールバックして、インジケーターのアニメーション化を停止するように指示します。

次の方法を使用します。

[NSObject performSelectorInBackground:withObject:]

getListFromPathスレッドを開始するには、それが完了したら、

[NSObject performSelectorOnMainThread:withObject:waitUntilDone:]

コントロールをメインスレッドに戻すと、スピナーアニメーションが停止します。

于 2011-07-12T09:42:26.300 に答える