好吧,這很奇怪。我有一個多線程應用程序,線程在主視圖中調用了一些方法。我使用調試器,線路運行,但沒有任何反應。這是流程:線程正在執行線路,但不起作用
我有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];
}
這將有助於您發佈代碼。 – ChrisF
添加了示例代碼,請參閱它是否有意義。 – Haoest