// 操作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
Secara amnya, anda tidak perlu melaraskan kaedah ProgressHUD Sebaliknya, anda perlu menentukan operasi yang memakan masa, dan kemudian meletakkan operasi yang memakan masa dalam urutan bukan utama, jika tidak, antara muka akan membeku.
Dalam soalan anda, pelaksanaan ayat ini adalah kuncinya. Apa sebenarnya yang anda lakukan dan dalam urutan apakah anda melakukannya dengan teliti.
Adakah kaedah anda dilaksanakan dalam urutan utama? dispatch_async dihantar ke utas utama untuk melaksanakan animasi pemuatan secara tak segerak Kod ini tidak akan dilaksanakan sehingga gelung seterusnya, jadi kod di bawah akan dilaksanakan sebelum animasi pemuatan dipaparkan. Alih keluar dispatch_async dan ia akan disegerakkan. Adakah downLoadFlieToThePhoneWithThreeModel:model segerak atau tak segerak?
Memandangkan utas dalam GCD akan tersekat jika ia dijalankan dalam utas, mula-mula gunakan [NSThread currentThread].isMainThread untuk menentukan utas utama, ia akan dipaparkan secara langsung.
Operasi 2 juga menyemak sama ada ia berada dalam utas utama Jika ia berada dalam utas utama, ia dilaksanakan dalam utas lain melalui GCD.