iphone - 如何保证线程同步

标签 iphone ios thread-safety performselector

我有一个方法myButtonAction它执行一些繁重的计算,我需要在后台线程上运行,同时我在主线程中加载一个指示“任务进度”的 View 。一旦后台线程完成执行该方法,我需要删除“任务进度” View 并在主线程中加载另一个 View 。

[self performSelectorInBackground:@selector(myButtonAction) withObject:nil];
[self performSelectorOnMainThread:@selector(LoadView) withObject:nil waitUntilDone:YES];

我面临的问题是,在 myButtonAction 之前完成执行,LoadView完成其执行。我怎样才能确定 LoadView仅在 myButtonAction 之后才开始执行完成其执行。

注:myButtonAction在另一个类中有它的方法定义。

最佳答案

使用Grand Central Dispatch :

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    [self myButtonAction];
    dispatch_async(dispatch_get_main_queue(), ^{
        [self LoadView];
    });
});

或者,如果你想留在 performSelector方法:
[self performSelectorInBackground:@selector(loadViewAfterMyButtonAction) withObject:nil];

在哪里
- (void)loadViewAfterMyButtonAction
{
    [self myButtonAction];
    [self performSelectorOnMainThread:@selector(LoadView) withObject:nil waitUntilDone:YES];
}

关于iphone - 如何保证线程同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11220556/

相关文章:

iphone - Json 解析 objective-c 中的 nil 字段

ios - TableView 不再加载但之前

c# - 获取和设置简单的静态属性线程安全吗?

Java - 在另一个线程中使用可变对象引用的首选设计?

c++ - std::vector push_back 在并行 for 循环中使用时失败

iphone - 在 iPhone 上的 MKMapView 中移动注释时避免闪烁

ios - 是否可以使用静态凭据在没有登录弹出窗口的情况下在谷歌驱动器或 Dropbox 中自动登录?

iphone - UIPickerView 显示问号而不是 UIImageView 和 UILabel

ios - 未获取就请求用户位置授权

c# - 在 Xamarin 中处理 WKWebView