2016-04-20 3 views
7

У меня есть NSTableView, который периодически прекращает анимировать и обновлять себя правильно, что приводит к ужасному пользователю.NSTableView анимация непротиворечивая

let oldRows = filteredDocuments 
let newRows = newFilteredDocuments 
let diff = oldRows.diff(newRows) 
filteredDocuments = newFilteredDocuments 

if (diff.results.count > 0) { 
    let deletionIndexPaths = NSMutableIndexSet() 
    diff.deletions.forEach { deletionIndexPaths.addIndex($0.idx) } 
    let insertionIndexPaths = NSMutableIndexSet() 
    diff.insertions.forEach { insertionIndexPaths.addIndex($0.idx) } 

    self.tableView?.beginUpdates() 
    self.tableView?.removeRowsAtIndexes(deletionIndexPaths, withAnimation: NSTableViewAnimationOptions.EffectFade) 
    self.tableView?.insertRowsAtIndexes(insertionIndexPaths, withAnimation: NSTableViewAnimationOptions.SlideLeft) 
    self.tableView?.endUpdates() 
} 

Там, кажется, нет никакой логики, когда она останавливается анимировать, и во многих тестах я сделал это чувствует себя почти как это строить связаны. Интересно, что он никогда не прекращает анимацию, когда я профилирую ...

Это как если бы что-то в основном потоке забивало пользовательский интерфейс, а затем NSTableView время и отменяет обновление, но я не знаю, как я могу отлаживать этот ,

+0

Я думаю, все, что вы можете сделать, это убедиться, что все выше код выполняется в главном потоке (оберните его в 'dispatch_async (dispatch_get_main_queue(), {...}') и попробуйте выполнить диспетчерскую работу, которая может блокироваться фоновым потоком, и посмотреть, улучшится ли она. Возможно, некоторые разумно размещенные логические операторы помогут вам обеспечить, чтобы этот код вызывался –

+4

Этот вопрос не содержит достаточной информации для воспроизведения проблемы. См. [mcve] – jtbandes

+1

Не могли бы вы приложить пример проекта, который воспроизводит проблему? – JAL

ответ

1

Как насчет того, если вы сделаете одно, а затем другое? Недавно я сделал что-то подобное, когда мне нужно было вставить ячейку и прокрутку, что привело к плохой работе с пользователем. Решение заключалось в том, чтобы добавить небольшую задержку. Не уверен, если это то, что вы пытаетесь сделать базу на небольшой фрагмент кода, но здесь мы идем:

let oldRows = filteredDocuments 
let newRows = newFilteredDocuments 
let diff = oldRows.diff(newRows) 
filteredDocuments = newFilteredDocuments 

if (diff.results.count > 0) { 
    let deletionIndexPaths = NSMutableIndexSet() 
    diff.deletions.forEach { deletionIndexPaths.addIndex($0.idx) } 
    let insertionIndexPaths = NSMutableIndexSet() 
    diff.insertions.forEach { insertionIndexPaths.addIndex($0.idx) } 

    self.tableView?.beginUpdates() 
    self.tableView?.removeRowsAtIndexes(deletionIndexPaths, withAnimation: NSTableViewAnimationOptions.EffectFade) 
    self.tableView?.endUpdates() 

    let delay = 0.35 
    let time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay * Double(NSEC_PER_SEC))) // Hate this syntax 
    dispatch_after(delay, dispatch_get_main_queue(), { [weak self] in 
     self?.tableView?.beginUpdates() 
     self?.tableView?.insertRowsAtIndexes(insertionIndexPaths, withAnimation: NSTableViewAnimationOptions.SlideLeft) 
     self?.tableView?.endUpdates() 
    }) 
} 
+0

Спасибо Doug за вас подумал - Я попробовал, но не имеет значения ... это действительно Нге. – Chris

+0

Вы пробовали играть с разным временем задержки? Я не знаком с синтаксисом начала и конца обновлений, но, похоже, для пакетной обработки. Вы пытались экспериментировать, не используя его? –

+0

Не знаю, почему это скомпилировано, но я только заметил, что вы используете NSMutableIndexSet, когда я думаю, что вы хотели использовать [NSIndexPath] ... или, может быть, Set (массив NSIndexPath или набор NSIndexPath, соответственно). Если это сработает, сообщите мне, и я отправлю его в качестве ответа. –

Смежные вопросы