一逢净、問(wèn)題及思路:
有人反饋鍵盤卡頓,但我手機(jī)上覺得鍵盤不卡呀牍鞠,于是我覺得應(yīng)該用工具來(lái)檢測(cè)一下咖摹,而不是肉眼觀察,主觀判斷难述。
二萤晴、解決過(guò)程:
我用Instruments里面的Timer Profile分析了一下程序,觀察到鍵盤彈出的時(shí)候胁后,執(zhí)行了哪些方法店读,耗時(shí)多少。觀察到有一個(gè)方法比較耗時(shí):preshowImage方法攀芯,是一個(gè)判斷最新一張圖片的方法屯断,由于遍歷了相冊(cè)中所有的照片,所以在手機(jī)中照片非常多的時(shí)候侣诺,是非常耗時(shí)的殖演,而我的測(cè)試機(jī)中由于照片較少,所以沒有那么卡紧武。這是一個(gè)問(wèn)題剃氧,代碼應(yīng)該寫在輸入框右邊的加號(hào)點(diǎn)擊事件中(類似微信),移除該方法了之后阻星,點(diǎn)擊輸入框,彈出鍵盤好了很多。我又分析了一下代碼妥箕,發(fā)現(xiàn)有一個(gè)方法比較耗時(shí)滥酥,是tableView reloadData。這句代碼真的是既多余畦幢,又耗時(shí)(寫代碼的人太隨意了)坎吻。去掉之后,又快了很多宇葱。繼續(xù)分析代碼瘦真,發(fā)現(xiàn)搜狗輸入法這種第三方鍵盤,比系統(tǒng)鍵盤耗時(shí)黍瞧,原因是:因?yàn)榈谌芥I盤或者是在鍵盤加個(gè)toolbar會(huì)導(dǎo)致執(zhí)行三次UIKeyboardWillShowNotification通知诸尽,原生鍵盤只執(zhí)行一次,這下找到原因了印颤,通過(guò)判斷您机,可以做到第三方鍵盤也執(zhí)行一次UIKeyboardWillShowNotification通知方法。
三年局、概括解決方法:
- 判斷輸入框际看,不調(diào)用遍歷照片庫(kù)方法,點(diǎn)擊右邊加號(hào)才調(diào)用矢否;
- 第三方鍵盤調(diào)用了三次方法仲闽,通過(guò)判斷,改成一次僵朗;
CGRect begin = [[[note userInfo] objectForKey:@"UIKeyboardFrameBeginUserInfoKey"] CGRectValue];
CGRect end = [[[note userInfo] objectForKey:@"UIKeyboardFrameEndUserInfoKey"] CGRectValue];
if(begin.size.height>0 && (begin.origin.y-end.origin.y>0)){
}
- 去掉無(wú)用代碼reloadData蔼囊;
- 遍歷照片庫(kù),篩選掉視頻衣迷,并且只遍歷相機(jī)膠卷庫(kù)畏鼓。
- 排序照片庫(kù),取第一個(gè)壶谒,不遍歷云矫。這里其實(shí)還有點(diǎn)問(wèn)題:相冊(cè)默認(rèn)是按日期倒序排列的,但是有沒有可能改變相冊(cè)的排序方式汗菜?让禀?后續(xù)我會(huì)再了解一下,再解決陨界。因?yàn)檫@里影響不大巡揍,所以暫時(shí)先這樣寫了,性能上優(yōu)化很多菌瘪。官方文檔這樣描述ALAssetsGroup的:
An ALAssetsGroup is a ordered set of assets. The order of its elements is the order that the user sees in the Photos application
-
代碼如下:
[assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:^(ALAssetsGroup *group, BOOL *stop) { [group setAssetsFilter:[ALAssetsFilter allPhotos]]; if (group) { [group enumerateAssetsWithOptions:NSEnumerationReverse usingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) { if (result) { NSDate *date = [result valueForProperty:ALAssetPropertyDate]; if ([date compare:lastDate] == NSOrderedDescending) { lastDate = date; lastPhoto = result; *stop = YES; } } }]; }
四腮敌、經(jīng)驗(yàn)總結(jié)
這個(gè)問(wèn)題最開始是這樣的:
- 有的人反饋鍵盤卡阱当,有的人不卡;
- 搜狗輸入法比系統(tǒng)鍵盤卡糜工;
解決之后弊添,大概知道了原因:
- 因?yàn)橛械娜讼鄡?cè)照片非常多,遍歷的次數(shù)更多捌木,更耗時(shí)油坝。
- 搜狗輸入法執(zhí)行三次UIKeyboardWillShowNotification通知,導(dǎo)致鍵盤彈出的方法執(zhí)行了三次刨裆,導(dǎo)致耗時(shí)澈圈;
以后遇到這樣的問(wèn)題,還是應(yīng)該用工具來(lái)檢測(cè)帆啃。尊重客觀事實(shí)瞬女,而不是肉眼觀察,主觀判斷链瓦。不能因?yàn)橛龅絾?wèn)題的人少拆魏,就不去解決問(wèn)題,經(jīng)過(guò)分析慈俯,此處代碼確實(shí)存在很多的問(wèn)題渤刃,寫的很不好。
后記:解決這個(gè)問(wèn)題的時(shí)候贴膘,還遇到了Instruments的一些問(wèn)題卖子,后續(xù)專門寫一篇文章來(lái)總結(jié)下Instruments的實(shí)際使用過(guò)程中遇到的問(wèn)題及解決方法。