【问题标题】:Run MBProgressHUD in another thread?在另一个线程中运行 MBProgressHUD?
【发布时间】:2011-04-16 08:27:12
【问题描述】:

我正在使用MBProgressHUD 在填充 UITableView 时显示“忙碌”动画以供用户使用。 UITableView 阻塞了主线程,因此动画在表格加载完成之前甚至不会出现。

有没有办法让忙碌的动画在另一个线程上运行,而UITableView 占据了主线程?

【问题讨论】:

    标签: cocoa-touch uitableview mbprogresshud


    【解决方案1】:

    UIKit 在运行循环完成当前循环时进行绘制。换句话说,如果您正在配置视图(例如 MBProgressHUD),则更改将在下一次运行循环迭代之前不可见。因此,如果您不允许通过阻塞主线程来旋转运行循环,则 UI 更改不会立即出现。

    如果您无法在后台线程上完成工作,则需要先让运行循环完成其循环,然后再在主线程上开始长时间运行的阻塞任务。

    您可以通过在下一次运行循环迭代中安排执行来做到这一点。

    // Setup and show HUD here
    
    [self performSelector:@selector(myTask) withObject:nil afterDelay:0.001];
    

    在 myTask 结束时隐藏 HUD。 或者您可以手动运行运行循环。

    // Setup and show HUD here
    
    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate distantPast]];
    
    // Insert myTask code here
    // Hide the shown HUD here
    

    或者(如果你可以使用积木)

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.001 * NSEC_PER_SEC), dispatch_get_main_queue(), ^(void){
        // Insert myTask code here
    });
    

    【讨论】:

    • 以上代码导致内存泄漏。知道如何解决吗?
    • 您能说得更具体些吗?哪个代码?上面的“代码”实际上并没有做任何与内存管理相关的事情,它只是一个可用 API 的列表。
    • @MatejBukovinski 当加载一个阻塞主线程直到加载的 UITableView 时,“myTask”会是什么?
    • 是的,我也遇到了同样的问题.. 但dispatch_after 也很有效!!哈哈!!
    • 不行!该错误出现的频率较低或总是出现在更复杂的工作中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-22
    • 2021-10-12
    • 2016-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多