2011-10-13 9 views
0

これは変です。私はマルチスレッドのアプリケーションを持って、スレッドはメインビューのいくつかのメソッドを呼び出します。私は、デバッガをステップスルー、行が実行されますが、何も起こりません。スレッドは行を実行していますが、無意味です

私はAViewControllerを持っており、callbackTarget(AViewController self)とUpdateScreen SelectorパラメータでWrapperクラスWを呼び出します。クラスWはUIImagePickerControllerを開き、画像を取得して、Image Processing(IP)クラスに渡し、callbackTargetとSelectorを渡します。 IPクラスは、スレッドを生成してイメージを処理します。これが完了すると、threadはcallbackTarget.Selectorを呼び出します。これは、AViewControllerの結果でビューを更新することです。

私はUpdateScreenにブレークポイントがあります。すべての行が実行されますが、画面上で何も起こりません。私はいくつかの変数がスレッド間で見えないと思っていますが、それを動作させる方法はわかりません。助けてください?

サンプルコードを追加してください。それは私が

コードスニペット

// AViewController, this is entry point 
     -(IBAction) callCardScanner_tapped{ 
      [testResultLabel setText:@"ocr started"]; // this is shown 
      CardScaner* scanner = [[CardScaner alloc] init] ; 
      [scanner scanWithCameraSendResultTo:self selector:@selector(updateScreenWithResultFromCardScanner:)]; 
      [scanner release]; 
     } 

//this method is used to pass into the thread so it can call back 
    -(void) updateScreenWithResultFromCardScanner:(OCRResult *)result{ 
    // ... update labels with result 
    // ... 
    [resultLabel setText: result.resultString]; // these lines seem to be executed by main thread according to debugger, but the screen remain blank 
    } 

CardScannerラッパークラス

-(void) scanWithCameraSendResultTo:(NSObject*) target selector :(SEL) selector{ 
// ... 
     UIViewController *rootViewController = [[[UIApplication sharedApplication] keyWindow] rootViewController]; 
     [rootViewController presentModalViewController:imagePicker animated:true]; 
} 

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{ 
// ... 
    ImageProcessor* recognizer = [[ImageProcessoralloc] init]; 
    [recognizer ocrImageInThread:img callbackTarget:callbackTarget selector:self.callbackMethod]; 
    [imagePicker release]; 
} 

イメージプロセッサクラス

で開始することが含まれていなかった理由です厄介です
+0

あなたのコードを投稿した方が役に立ちます。 – ChrisF

+0

サンプルコードを追加しましたが、意味があるかどうか確認してください。 – Haoest

答えて

1

処理が完了したら、メインスレッドでビューを更新する必要があります。 UIKitのほとんどはスレッドセーフではなく、メインスレッドで処理する場合にのみ動作することが保証されています。

performSelectorOnMainThreadまたはdispatch_async機能ファミリを使用して、作業をメインスレッドに戻すことができます。

+0

画像処理クラスで生成されたスレッドはAViewControllerメソッドのperformSelectorOnMainThreadを呼び出します – Haoest

+0

メインスレッドで発生する必要があるすべてが本当にメインスレッドにありますか?メインスレッドでもUIImagePickerControllerを終了していますか? ChrisFが言及したように、コードを投稿すると役立ちます。 – Danra

関連する問題