2014-03-19 203 views
5

我在iOS 7.1中使用UIDocumentInteractionController,它的性能非常糟糕。UIDocumentInteractionController真的很慢

我在UICollectionViewController中使用它來查看集合視圖中的文檔。

按集合視圖中的項目時,大概需要大約6(是,那是六)秒出現。從用戶體驗角度來看,他們在屏幕出現之前再次按了幾次屏幕,因爲屏幕需要這麼長時間。

我使用的是自iOS 6以來的相同代碼,但現在看起來特別糟糕。如果有人對我如何加快速度有任何想法,那將不勝感激。

從本質上講,我有我的頭文件如下:

interface MyViewController : UICollectionViewController <UIDocumentInteractionControllerDelegate> 
{ 
    UIDocumentInteractionController *docController; 
} 
@end 

,並在實施中,我只是在做以下操作:

在viewDidLoad中(最近搬到了這裏,看它是否提高的東西):

docController = [[UIDocumentInteractionController alloc] init]; 
docController.delegate = self; 

然後在的CollectionView:didSelectItemAtIndexPath:我這樣做:

NSURL *fileURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:document.Link ofType:@"" ]]; 
[docController setURL:fileURL]; 
PresentationViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"DocumentCell" forIndexPath:indexPath]; 
CGRect rect1 = cell.frame; 
bool didShow = [docController presentOptionsMenuFromRect:rect1 inView:collectionView animated:YES]; 

其中文檔只是一個包含URL字符串的類。

讓我知道你是否需要任何進一步的細節。

在此先感謝任何人可以提供的幫助。

- 更新: 一些NSLogs後,我注意到,這是絕對的下面一行是很慢:

bool didShow = [docController presentOptionsMenuFromRect:rect1 inView:collectionView animated:YES]; 
+0

你能對此做些什麼嗎?我似乎有這個問題? – GenieWanted

+0

不,不幸的不是。我正考慮在這一點上使用Apple的2張門票中的一張。這真是令人沮喪。如果我設法解決任何問題,我會發布。 – Darren

+0

我注意到,在我的情況下,它以十六進制轉儲方式將整個文件的內容寫入控制檯日誌「提供的未知活動項目」。這可能會增加延遲,但我不知道如何避免這種情況。 – fishinear

回答

2

TL; DR:

您所使用的方法是同步的請求它使用您的文檔數據來查找哪些應用程序能夠讀取您的文件。您需要與將枚舉限制爲僅可解析文件類型的應用程序的異步版本交換。

刪除此方法:

- (BOOL)presentOptionsMenuFromRect:(CGRect)rect 
           inView:(UIView *)view 
           animated:(BOOL)animated 

而且用這種方法代替:

- (BOOL)presentOpenInMenuFromRect:(CGRect)rect 
           inView:(UIView *)view 
          animated:(BOOL)animated 

摘自Apple Docs

這種方法類似於presentOptionsM enuFromRect:inView:animated:方法,但提供了一個菜單,僅限於能夠打開當前文檔的應用程序列表。該確定基於文檔類型(由UTI屬性指示)和已安裝應用程序支持的文檔類型。要支持一種或多種文檔類型,應用程序必須使用CFBundleDocumentTypes鍵在Info.plist文件中註冊這些類型。

如果沒有支持打開文檔的註冊應用程序,則文檔交互控制器不顯示菜單。

此方法異步顯示選項菜單。文檔交互控制器在用戶選擇適當的選項時自動關閉菜單。您也可以使用dismissMenuAnimated:方法以編程方式解除它。

+2

嗨。感謝您的迴應。不幸的是,使用OpenIn而不是「選項」不會顯示「快速查看」,在經過快速調查後,肯定是用戶想要保留的內容。另外,從iOS 8開始,現在需要大約30秒才能顯示菜單。我登錄了一張Apple的門票,他們記下了我的名字,並告訴我將它記錄爲一個我已經完成的錯誤 - 等待迴應。 – Darren

+0

嘿,很高興知道。我想使用選項版本以及我的應用程序。你會介意粘貼到雷達的鏈接嗎?謝謝! – pxpgraphics

+0

嗨,它是數字18392126 - 也張貼在OpenRadar:http://openradar.appspot.com/18392126 – Darren

1

我遇到了類似的問題:

UIDocumentInteractionController.presentPreviewAnimated

這將需要一個非常長的時間才能完成。我發現在保存要預覽的文件和顯示預覽文件之間添加了一個短暫的延遲,可以解決問題:

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(100 * NSEC_PER_MSEC)), dispatch_get_main_queue(), { 
    self.controller.presentPreviewAnimated(true) 
})