0

ここで少し問題があります。ユーザーがビデオをサーバーにアップロードできるようにしていますが、進行状況を説明するために使用しているビューを管理するのに問題があります。問題が発生している理由はわかっています。それを回避する方法(一種の)ここで私の問題

したがって、次のようなコードを作成しようとすると (UIViewController で)

-(void)uploadMovie
{
   UIActivityView indicator=new...
  [self.view addSubview:indicator]
   [uploader UploadMyMovie:data]

 }

このコードは機能しません。アップローダーはコントローラーをロックし、インジケーターが画面に表示されるまでの時間を許可しません。アップローダーを呼び出す前に数秒待っていることがわかりましたが、別のアプローチを取りました。

アプローチは、アップローダの新しいスレッドを開始し、アップローダ オブジェクトがアップロードの開始時、進行状況、およびアップロードの終了時に UIViewController (または何らかのデリゲート) に通知するプロトコルを持つことでした。何かのようなもの

     -(void)uploadMovie
    {
       UIActivityView indicator=new...
      [self.view addSubview:indicator]
       NSThread *thread=...
       [thread start]
     }

デリゲートメソッドは次のようになります

    #pragma mark UploadProgressDelegate

-(void)didStartUploading
{

    progressLabel= [[UILabel alloc] initWithFrame:CGRectMake(93, 240, 116, 32)];
    ind= [[UIActivityIndicatorView alloc]   initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
    ind.center=self.view.center;
    [progressLabel setTextColor:[UIColor blackColor]];
    [progressLabel setText:@"TEST"];
    [self.view addSubview:progressLabel];
    [self.view addSubview:ind];
    [ind startAnimating];
    [self.view bringSubviewToFront:progressLabel];
    [ind setHidesWhenStopped:TRUE]; 
    [self.view setUserInteractionEnabled:FALSE];
}
-(void)progressUpdate:(NSString*)progress
{
     [progressLabel setText:progress];
}
-(void)didEndUploading;
{
    [progressLabel removeFromSuperview];
    [ind stopAnimating];
    [ind removeFromSuperview];
    [progressLabel release];
    [ind release];
    [self.view setUserInteractionEnabled:TRUE];
}

これはうまく機能し、インジケーターが表示され、すべてが表示されます。その後、UILabel (上記のコードに反映されています) を追加して進行状況をユーザーに表示することにしましたが、このソリューションは機能せず、ラベルは表示されず、もちろん更新もありません...

誰かがこの状況に遭遇し、その解決策を思いついたのではないかと思っていましたか? または、上記のコードから、ラベルが表示されない理由を確認できる場合...

ありがとう

4

2 に答える 2

1

場合によっては、特定のことを行うためにメインスレッドに戻る必要があることがわかりました...

したがって、デリゲートメソッドでは

[self performSelectorOnMainThread: @selector(updateLabel:) withObject:newLabelText waitUntilDone:NO];

その後

- (void) updateLabel:(NSString *)newLabelText
{
    [progressLabel setText:newLabelText];
}

ただし、バックグラウンドではなくメインスレッドで実行する必要があることのルールが何であるかはわかりません。

于 2009-07-25T03:33:04.037 に答える
1

UIKit はスレッドセーフではありません。UI 要素を更新している場合は、メイン スレッドに同期し直す必要があります。そうしないと、すべてがオフになります。

于 2009-07-25T04:53:55.527 に答える