良い一日、
日付項目などを選択するたびに setneedslayout を使用して再描画する必要がある複雑なカレンダー コントロールがあります。これを GCD ブロックで実行しようとしましたが、実行されませんでした。ただし、メインスレッドで実行するとsetNeedsLayoutが実行され、機能します。ただし、これにより、ユーザー エクスペリエンスを破壊する厄介なスタッター/ラグがプログラムに発生します。
何ができるかを知ることができますか?これを別のスレッドで実行できますか? NSTimer を使用したり、別のスレッドでセレクターを実行したりできますか?
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
dispatch_async(dispatch_get_main_queue(), ^{
//[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
});
@try {
NSLog(@"New Thread");
if (self.selectedDate) {
[datesToReload addObject:self.selectedDate];
}
if (date) {
[datesToReload addObject:date];
}
self.selectedDate = date;
[self reloadDates:datesToReload];
[self performSelectorOnMainThread:@selector(reloadDates:) withObject:datesToReload waitUntilDone:NO];
//[self perform]
if (visible && date) {
self.monthShowing = date;
}
}
@catch (NSException *exception) {
NSLog(@"Exception = %@", exception);
}
dispatch_async(dispatch_get_main_queue(), ^{
//[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
NSLog(@"Main Thread");
});
});