objective-c - 应该如何更改此代码才能正常工作?

标签 objective-c multithreading cocoa-touch selector nsthread

我从 http://github.com/matej/MBProgressHUD 下载了一些代码在做某事时显示进度表。

这是使进度表弹出的代码。

[HUD showWhileExecuting:@selector(myTask) onTarget:self withObject:nil animated:YES];

这将在 myTask 方法运行时显示进度表。

奇怪的是,当 myTask 运行时,它还允许程序在此行以下继续执行。这不是我想要的行为。我希望在 myTask 运行时显示进度表,并且只有在 myTask 完成运行后,我才希望程序执行在此行以下继续。

这是 showWhileExecuting 方法的代码。
- (void)showWhileExecuting:(SEL)method onTarget:(id)target withObject:(id)object animated:(BOOL)animated {

    methodForExecution = method;
    targetForExecution = [target retain];
    objectForExecution = [object retain];

    // Launch execution in new thread
 taskInProgress = YES;
    [NSThread detachNewThreadSelector:@selector(launchExecution) toTarget:self withObject:nil];

 // Show HUD view
 [self show:animated];
}

为了获得我想要的行为,我应该编辑这段代码,还是做其他事情?

我试图通过在调用此方法之前设置一个 bool 值来解决这个问题,这会导致程序执行立即卡在 while 循环中,直到在 myTask 结束时更改 bool 值。这是可行的,但由于某种原因,它会导致仪表在最后只显示一瞬间,而不是像预期的那样始终显示。这是为什么?

最佳答案

您正在调用的方法是在新线程上运行您的任务。

您的 while 循环方法不起作用,因为 UI 显示更新是在主线程上完成的。当你在 while 循环中时,你阻塞了主线程。

我建议您将任务完成后要运行的代码移至新方法。然后,在您的任务结束时,调用此方法。 (或者,让它发送通知或其他信号。)

另外,查看有关线程和运行循环的文档,了解这个主题很重要。

关于objective-c - 应该如何更改此代码才能正常工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3879249/

相关文章:

ios - 在 Objective-C 中通过 NSNotificationCenter 发送和接收消息?

iphone - ARC 在 iOS 4.3 中不工作

c++ - boost asio在两个线程c++之间进行通信

ios - 设置 imageview 角半径

objective-c - 带有扩展项目的 ReloadData 不会刷新子项

multithreading - 对 TThread 的一些帮助(Terminate、FreeOnTerminate 和线程领域的其他冒险)

具有四核处理器的笔记本电脑中的 Java 多线程

iphone - CGImageCreateWithImageInRect 无法正常工作

iphone - Game Center 自定义排行榜 - 我真的需要调用 2 次电话才能获取玩家的别名吗?

iphone - 我是否可以更改 NSManagedObjectContextObjectsDidChangeNotification 中的对象图?