2013-04-20 13 views
9

Używam QuickLook Framework w mojej aplikacji na iOS do podglądu różnych plików. Ostatnio zauważyłem, że QuickLook przechowuje pamięć podręczną wszystkich podglądanych plików w katalogu mojej aplikacji o nazwie tmp. Istnieją jednak dwa problemy z buforowaniem plików QuickLook:Zapobieganie generowaniu pamięci podręcznej przez iOS QuickLook

  1. Te buforowane pliki są już zapisane w katalogu Dokumenty. Więc teoretycznie aplikacja może podwoić rozmiar, jeśli użytkownik chce wyświetlić podgląd wszystkich swoich plików (które prawdopodobnie będą). W porządku, nic wielkiego, mogę okresowo wyczyścić pamięć podręczną za pomocą tego kodu:

    NSFileManager *fileMgr = [NSFileManager defaultManager]; 
    NSArray *fileArray = [fileMgr contentsOfDirectoryAtPath:NSTemporaryDirectory() error:nil]; 
    for (NSString *filename in fileArray) { 
        [fileMgr removeItemAtPath:[NSTemporaryDirectory() stringByAppendingPathComponent:filename] error:NULL]; 
    } 
    
  2. Drugi i najważniejsze że QuickLook wydaje się być stworzenie wtórnego cache w folderze systemowym (nie moja aplikacja). Jest to problem, ponieważ użytkownicy mają możliwość szyfrowania pojedynczych plików w mojej aplikacji. Jeśli podglądają plik przed zaszyfrowaniem, wygląda to normalnie. Jeśli następnie zaszyfrują, a następnie przejdą do podglądu, plik nadal będzie wyglądał tak, jakby nie był zaszyfrowany. Wiem, że nie ma problemu z szyfrowaniem, ponieważ zaszyfrowany plik przechowywany w katalogu mojej aplikacji Documents jest zaszyfrowany i nie może być odczytany (poprawnie) przez żaden program. Jest to poważny problem, ponieważ może to spowodować, że użytkownik uwierzy, że plik nie został zaszyfrowany. Jest to również problem związany z bezpieczeństwem, ponieważ oznacza to, że QuickLook buforuje plik w innym miejscu.

Oto mój kod QuickLook:

- (NSInteger)numberOfPreviewItemsInPreviewController:(QLPreviewController *)controller { 
    return 1; 
} 

- (id <QLPreviewItem>)previewController:(QLPreviewController *)controller previewItemAtIndex:(NSInteger)index { 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    //Get the stored user data and file name 
    NSString *FileName = [defaults objectForKey:@"FileName"]; //Name of file stored in NSUserDefaults 
    NSString *finalFilePath = [documentsDirectory stringByAppendingPathComponent:FileName]; 

    return [NSURL fileURLWithPath:finalFilePath]; 
} 

- (IBAction)previewFile:(id)sender { 
    //Setup QuickLook 
    QLPreviewController *previewController = [[QLPreviewController alloc] init]; 
    previewController.delegate=self; 
    previewController.dataSource=self; 
    previewController.currentPreviewItemIndex = 0; 
    [previewController reloadData]; 
    [self presentModalViewController:previewController animated:YES]; 
    [previewController.navigationItem setRightBarButtonItem:nil]; 
} 

Czy ktoś wie, gdzie cache QuickLook jest, czy istnieje jeden (może to jakiś bug)?

Jak mogę zapobiec QuickLook z buforowania plików lub jak zresetować pamięć podręczną? Jeśli żadna z nich nie jest możliwa, istnieje alternatywa iOS 6 do QuickLook (słyszałem, że QuickLook został zmieniony w iOS 6, więc nie ma żadnych obejść, alternatyw, itp.)?

Wszelkie rozwiązania i pomysły doceniane!

+1

Nie mam dla ciebie odpowiedzi innej niż "Nie widziałem ani jednego sposobu i użyłem" UIWebView "(pomimo gorszej funkcjonalności). Czy próbowałeś przesłać Apple prośbę o funkcję i zobaczyć, co powiedział? – DBD

Odpowiedz

1

Jeśli nie ma sposobu, aby uniemożliwić QLPreviewController wykonywanie własnego buforowania, warto rozważyć utworzenie własnej wersji QLPreviewController za pomocą interfejsu UIWebView (ponieważ może on wyświetlać wiele typów plików, takich jak PDF, dokumenty, xls, itp.).

Nie jest to idealne rozwiązanie, a jakość interfejsu nie będzie zbliżać się do poziomu wydajności/interfejsu użytkownika, jaki zapewnia QLPreviewController. Tak ... To jest trochę zhakowane rozwiązanie, ale brakuje publicznego interfejsu API do czyszczenia dodatkowej pamięci podręcznej ... to jedyna rzecz, jaką mogę wymyślić.

Podejrzewam, że to podrzucanie pomiędzy przyjaznością dla użytkownika i bezpieczeństwem.

Powodzenia!

1

Wierzę, że można przywrócić całą pamięć podręczną z wiersza poleceń za pomocą:

qlmanage -r cache 

lub wygenerować podgląd dla konkretnych dokumentów przy użyciu:

qlmanage -p document.ext 

Ale ponieważ jest to rozwiązanie z linii poleceń, to prawdopodobnie nie jest to, czego potrzebujesz. Życzymy powodzenia.

+1

Zgaduję, że działałoby to na OSX, ale prawdopodobnie nie na iOS - ponieważ nie ma żadnego dostępu do wiersza poleceń :-( –

+2

Bardzo dobry punkt. Zastanawiam się, dlaczego myślałem, że OP był przy użyciu OSX. odpowiedź w przypadku, gdy inni mają problemy z QuickLook w OSX. – Jonathan

1

Być może spróbuj NSURLCache i zobacz, czy to pomaga.

ustawić go w didFinishLaunchingWithOptions Zastosowanie:

int cacheSizeMemory = 8*1024*1024; // 8MB 
int cacheSizeDisk = 16*1024*1024; // 16MB 
NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:cacheSizeMemory diskCapacity:cacheSizeDisk diskPath:@"nsurlcache"]; 
[NSURLCache setSharedURLCache:sharedCache]; 

Następnie można wykonać następujące czynności, jeśli chcesz opróżnić pamięć cache

[[NSURLCache sharedURLCache] removeAllCachedResponses]; 

, czy to działa z szybkim spojrzeniem ja nie wiem, ale warto spróbować.

Powiązane problemy