2016-03-15 81 views
0

我有一個類似於UITableView工作的數據源的自定義控件。我還添加了一個reloadData函數來加載新的數據。如何實現像UITableView reloadData

我想重裝數據執行被稱爲每次運行一次循環,避免重裝一次相同的數據更多。

這是我目前實施:

func reloadData(){ 
    guard reloadDataScheduled == false else{ 
     return 
    } 

    self.reloadDataScheduled = true 
    NSRunLoop.currentRunLoop().performSelector("innerReloadData", target: self, argument: nil, order: 0, modes: [NSDefaultRunLoopMode]) 
} 

的innerReloadData是實際執行裝載,並設置reloadDataScheduled假私有函數。

這似乎是工作大部分的時間,但其他情況下,它似乎延遲2秒以上,這不是我想要的。

我需要洞察runloop或如何實現實現這種風格的任何建議的延遲。

+0

這是一個UIView子類,它可以讓你建立'setNeedsDisplay'或'setNeedsLayout'嗎? – Jonah

+0

是的,它是一個UIView子類。 –

回答

1

我通常在這種情況下使用下面的代碼。

- (void)setNeedsReloadData 
{ 
    // cancel all previous schedules 
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(reloadData) object:nil]; 

    // below codes schedule "immediately run after current fetching on runloop" 
    [self performSelector:@selector(reloadData) withObject:nil afterDelay:0]; 
} 
- (void)reloadData 
{ 
    // cancel the others schedules 
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(reloadData) object:nil]; 

    // Reload Data 
    ... 
} 

U可以調用-[XXX setNeedsReloadData]任何時間,任何時間。 reloadData將在runloop上每次讀取時運行一次。

ps。在SWIFT中

  • 在swift之前1.1 - [NSObject performSelector: withObject: afterDelay:]被阻止。
  • swift 2.0之後 - 現在它被允許。
+0

是的,它似乎按預期工作。我只是希望我能知道爲什麼實際的NSRunLoop沒有。 Thanks.- –

+0

'''[自performSelector:@selector(reloadData)withObject:無afterDelay:0]'''是'''NSRunLoop.currentRunLoop()performSelector( 「reloadData」,目標便於學習方法:自,參數:nil,order:0,modes:[NSDefaultRunLoopMode])''' 你可以使用任何你想要的代碼。 – TopChul

+0

無論如何,U應取消先前安排在射擊'''reloadData'''或者'''setNeedsReloadData''' – TopChul