2013-05-21 28 views
0

美好的一天,的iOS SetNeedsLayout上線

我有一個需要使用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"); 
    }); 
}); 
+0

其運行setNeedsLayout的reloadDates操作,並導致該問題。目前,在主線程上運行它的上述修復程序當然仍然會造成延遲 – raaj

回答

0

所有UI更新需要在主線程上運行,您不能從後臺線程更改UI(它會產生不可預知的副作用)。

如果您遇到性能問題,您應該使用Instruments來分析您的應用程序,找出需要處理的時間並解決該問題(例如,您是否確實需要重新加載所有日期以及需要花費大量時間? )。

0

建議使用上面的代碼示例:

1)您正在調用reloadDates兩次;即使視圖在使用perform_selector進行第二次調用之前沒有成功更新,您仍然執行兩次相同的工作。僅此一項就會使您從reloadData方法中遇到的任何UI滯後加倍。

2)使用較低的優先級隊列的大部分工作:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ 

    if (self.selectedDate) { 
     [datesToReload addObject:self.selectedDate]; 
    } 

    if (date) { 
     [datesToReload addObject:date]; 
    } 

    self.selectedDate = date; 
    [self reloadDates:datesToReload]; 

    if (visible && date) { 
     self.monthShowing = date; 
    } 

}); 

裏面reloadDates,把只有在主隊列異步塊setNeedsLayout通話。

一旦完成,如果您仍然有不可接受的UI延遲級別,則需要查看正在重繪的視圖並查看如何使其更快。儀器的時間分析器是在這些重繪事件中查看您使用CPU時間的第一步。