2013-07-21 47 views
4

第一次成爲第一個響應者被調用,速度很慢。儀器的測量時間大約爲160ms ......當它加載完所有加載的內容以獲得屏幕上的鍵盤時,鍵盤就顯示出來了!殺死大部分流暢的動畫。我怎樣才能加速成爲第一響應者?

但是第二次,它快速發展!它只需要2ms!

那麼,我能以某種方式做到這一點嗎?

+0

什麼是你'becomeFirstResponder'這樣做,正在採取所有的時間!? – bbum

+0

我個人指出,如果您有其他鍵盤,特別是表情符號,鍵盤需要額外的時間。我用英文,西班牙文,日文和表情符號鍵盤測試鍵盤的框架,我總是注意到一個大的放緩。 – Can

+0

查看@ Vadoff的答案在這裏 - http://stackoverflow.com/a/20436797/558575 – amergin

回答

2

使用GCD

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
// heavy lifting here 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [someTextField becomeFirstResponder]; 
    }); 
}); 

這起初並不如預期工作,但它採用的GCD一些「提升」這是在後臺發生後做到了。就我而言,這是一個scroling視圖

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
// heavy lifting here 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [_tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES]; 
    }); 
}); 
+3

除了可能延遲'becomeFirstResponder'直到下一個通過事件循環,第三個版本不會做任何事情。所有的工作仍然在主線上完成。第一個解決方案非常脆弱和醜陋。第二種解決方案似乎是不解決的;它似乎沒有真正改變任何東西。 – bbum

+0

第三種解決方案確保它異步運行。對於我在背景上做的舉重做同樣的事情,確保他們中的任何一個都不會踩到腳趾。結果是有點延遲,是的,但不影響動畫的平滑度。我無法預測成爲FirstFirstResponder所需的時間,因此這成爲了一個更加優雅的解決方案。我將更新答案並刪除解決方案1和2. – nmdias

+1

您不能在主線程上異步運行某些內容,並且*不阻止或延遲事件循環*。如果它解決了這個問題,那是因爲它是在當前通過主事件循環之後的下一個階段完成的;你可以使用延遲爲0.0的'dispatch_after()'或者'performSelector:withObject:afterDelay:0.0 ...'並且得到相同的結果而不需要額外的塊入隊。 (而且,如果真的能解決這個問題,那麼......整潔!注意!) – bbum