gpt4 book ai didi

cocoa - UI刷新、NSOutlineView reloadData和递归方法

转载 作者:行者123 更新时间:2023-12-03 16:55:18 24 4
gpt4 key购买 nike

我填充一个 NSOutlineView 以递归方式读取目录。读取目录及其子目录后,我在调度内调用 reloadData 刷新大纲,如下所示

-(void)readDir:(NSString*)path {
dispatch_async(dispatch_get_main_queue(), ^{ \
[outlineView reloadData];
});

//////////
//// some internal stuff
//////////

NSArray* subs = [self getSubDirs:path];
for (NSString* p in subs) {
[self readDir:p];
}
}

上面的方法是从调度内部调用的,以使 UI 具有反应性

   - (void)startAll {
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
dispatch_async(queue, ^{
[self readDir:@"/"];
});
}

问题是有时在子目录正在读取时调用dispatch_async(dispatch_get_main_queue(), ...)(它根本是异步的!)并且应用程序崩溃

如果我使用dispatch_sync(dispatch_get_main_queue(), ...)(注意sync版本),轮廓绘制总是正确的,但它非常非常慢,所以问题是:

我怎样才能尽可能快地重新排列代码并等待dispatch_[a]sync(dispatch_get_main_queue(), ...)完成?

最佳答案

听起来问题在于,当一些内部内容在一个线程中执行时,您的模型处于不一致的状态,reloadData无法正确处理。

您是否在充分设置目录条目之前将其添加到其父目录中?

关于cocoa - UI刷新、NSOutlineView reloadData和递归方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7585956/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com