2011-10-13 41 views
0

好吧,這很奇怪。我有一個多線程應用程序,線程在主視圖中調用了一些方法。我使用調試器,線路運行,但沒有任何反應。這是流程:線程正在執行線路,但不起作用

我有AViewController,它調用包裝類W與callbackTarget(AViewController自我)和UpdateScreen選擇器參數。 W類打開UIImagePickerController,抓取圖像,並傳入圖像處理(IP)類,傳遞callbackTarget和Selector。 IP類然後生成一個線程來處理圖像。當這完成時,線程調用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]; 
} 

圖像處理器類

- (void) ocrImageInThread:(UIImage*) photo callbackTarget:(NSObject*) target selector:(SEL) selector{ 
     NSArray* args = [NSArray arrayWithObjects:photo, target, NSStringFromSelector(selector), nil]; 
     NSThread* ocrThread = [[[NSThread alloc] initWithTarget:self selector: @selector(ocrImageThread_start:) object:args] autorelease]; 
     [ocrThread start]; 

    } 

    -(void) ocrImageThread_start:(NSArray*) args{ 
    //.. do image processing to acquire result object, here in the end invoke the callback method 
     [callbackTarget performSelectorOnMainThread:NSSelectorFromString(selector) withObject:resultObject waitUntilDone:NO]; 
     [resultObject release]; 
     [pool release]; 

} 
+0

這將有助於您發佈代碼。 – ChrisF

+0

添加了示例代碼,請參閱它是否有意義。 – Haoest

回答

1

處理完成後,您必須更新您的視圖主線線程。大多數UIKit不是線程安全的,只有在主線程上處理時才能保證工作。

您可以使用performSelectorOnMainThreaddispatch_async函數族將作業傳回主線程。

+0

在圖像處理類中產生的線程調用AViewController方法的performSelectorOnMainThread – Haoest

+0

您確定主線程上應該發生的所有事情都確實在主線程上嗎?你是否也在主線程上關閉了UIImagePickerController?正如ChrisF所說,如果您發佈代碼,這將有所幫助。 – Danra