// 操作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 を削除すると同期されます。 downLoadFlieToThePhoneWithThreeModel:model は同期ですか、それとも非同期ですか?
GCD内のスレッドはスレッド内で実行するとスタックしてしまうので、まず[NSThread currentThread].isMainThreadを使ってメインスレッドを決定し、メインスレッドであれば直接表示します。
操作 2 も、メインスレッド内にあるかどうかを確認し、メインスレッド内にある場合は、GCD を介して別のスレッドで実行されます。