ios 如何在数据导入到CoreData时显示progressBar?

5ssjco0h  于 2022-12-27  发布在  iOS
关注(0)|答案(3)|浏览(126)

我正在将大量数据导入CoreData。我希望显示导入进度的进度条。
首先,我显示进度条,然后计算要导入的数据,最后设置一个for循环:

  • 在这个for循环中,我首先设置了coreData对象。
  • 然后我会增加进度视图。

在这个循环之后,我将保存coreData对象并隐藏progressBar。

[self.progressView show];

int allFiles = [file count];
int currentFile = 1;

for(NSString *trackid in file) {
    [entidyDesc setName:[track objectForKey:@"theKey"]];
    float progress = [self convertAmountForProgressBar:currentFile maxNum:allFiles];
    self.progressView.progressBar.progress = progress;
}

[self.progressView hide];
[self.managedObjectContext save:nil];

(简化)
问题是,progressBar没有更新。它显示出来,但是在for循环完成后先更新,然后隐藏起来。所以,进度条只在for循环后短时间内显示。
有什么办法解决这个问题吗?

ws51t4hk

ws51t4hk1#

在另一个线程中执行导入,并使用-[NSObject performSelectorOnMainThread:withObject:waitUntilDone:]将进度信息发送到主线程。
祝您调试并发问题愉快。
您也可以使用CATransactions做一些糟糕的事情,但我的印象是UIKit应该为您处理所有这些事情。

kyks70gy

kyks70gy2#

是否尝试使用以下项启用线程动画:

- (void)setUsesThreadedAnimation:(BOOL)flag

更多信息请参见Apple文档。

lf3rwulv

lf3rwulv3#

在显示进度后一秒钟调用core data方法,如下所示:

DispatchQueue.main.async { [self] in
           
            SVProgressHUD.show()
           
            DispatchQueue.main.asyncAfter(deadline: DispatchTime.now())
            {
                coreDataMethod()
            }
            
        }

数据保存后,从该函数中删除progress:

SVProgressHUD.dismiss()

相关问题