// 操作1
dispatch_async(dispatch_get_main_queue(), ^{
[SVProgressHUD show];//loading动画
});
// 操作2
NSArray *files = @[model];
DownFileDataControl *downVC = [[DownFileDataControl alloc]init];
downVC.rootViewController = curViewController;
downVC.thisModel = model;
downVC.modelList = files;
[downVC downLoadFlieToThePhoneWithThreeModel:model];//根据model对象里的一个文件地址去读取文件。读取完全后跳转到一个新的页面
(SVProgressHUD 是异步操作的话有办法改成同步吗)
上述代码,在一个方法体内写的,因为读取文件的时间比较长,所以想着在读取前加一个loading效果,但是加上之后,发现loading依然是等操作2执行完毕后才显示效果,操作2执行时候(读取文件)程序有一种假死的感觉,请问,是什么原因,如何让loading先出来,再执行操作2
일반적으로 ProgressHUD 방법을 조정할 필요는 없습니다. 대신 시간이 많이 걸리는 작업을 확인한 다음 시간이 많이 걸리는 작업을 메인 스레드가 아닌 스레드에 배치해야 합니다. 그렇지 않으면 인터페이스가 정지됩니다.
으아악귀하의 질문에서 이 문장의 구현이 핵심입니다. 정확히 무엇을 했고, 어떤 스레드에서 했는지 잘 확인하세요.
메서드가 메인 스레드에서 실행되나요? dispatch_async는 로딩 애니메이션을 비동기적으로 실행하기 위해 메인 스레드로 전달됩니다. 이 코드는 다음 루프까지 실행되지 않으므로 로딩 애니메이션이 표시되기 전에 아래 코드가 실행됩니다. Dispatch_async를 제거하면 동기화됩니다. downLoadFlieToThePhoneWithThreeModel:model은 동기식인가요, 비동기식인가요?
GCD의 스레드가 스레드에서 실행되면 중단되므로 먼저 [NSThread currentThread].isMainThread를 사용하여 메인 스레드인 경우 직접 표시됩니다.
작업 2도 메인 스레드에 있는지 확인합니다. 메인 스레드에 있으면 GCD를 통해 다른 스레드에서 실행됩니다.