ios - 线程正在执行行,但无效

标签 ios multithreading

好吧,这很奇怪。我有一个多线程应用程序,线程在主视图中回调一些方法。我使用调试器单步执行,行已运行,但没有任何反应。流程如下:

我有AViewController,它使用callbackTarget(AViewController self)和UpdateScreen Selector参数调用Wrapper类W。 W 类打开 UIImagePickerController,抓取图像,然后传递到图像处理 (IP) 类,同时传递回调目标和选择器。然后 IP 类生成一个线程来处理图像。完成后,线程调用callbackTarget.Selector,它用AViewController 中的结果更新 View 。

我在 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];

}

最佳答案

处理完成后,您必须更新线程上的 View 。大多数 UIKit 都不是线程安全的,只有在主线程上处理它才能保证工作。

您可以使用performSelectorOnMainThreaddispatch_async函数系列将工作转移回主线程。

关于ios - 线程正在执行行,但无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7751736/

相关文章:

c++ - 静态线程安全和初始化顺序

ios - iOS13 Action Sheet UI问题,无法自定义消息和边框线

ios - XCode4代码需要签名3次吗?

ios - Swift:UITableViewCell 中的手势不起作用

ios:在主线程外播放声音

python flask线程一直在运行,无法停止

java - 为什么在 Java 中停止一个线程这么难?

WPF,在后台工作人员中调用服务器方法

ios - 更改未在 Interface Builder 中创建的 UIButton 的文本

ios - 我可以使用某种方法来获取变量名吗?