2012-03-03 10 views
5

Pytanie podstawowe: Jeśli masz adres URL zasobu i chcesz pobrać obraz tego zasobu, w jaki sposób faktycznie sprawdzasz, czy zasób rzeczywiście istnieje? Proszę zapoznać się z pełnym wyjaśnieniem poniżej, aby uzyskać szczegółowe informacje o tym, co mam na myśli.Jak sprawdzić, czy adres URL zasobu rzeczywiście wskazuje istniejący zasób?

Mam aplikację, którą rozwijam, która pozwala użytkownikom grupować obrazy w "pakiety" do dalszego przetwarzania. Obrazy mogą pochodzić z udostępniania iTunes, kamery urządzenia (jeśli jest dołączone) lub z biblioteki zdjęć urządzenia. Ponadto, użytkownik może edytować obrazy na kilka podstawowych sposobów. "Pakiety" mogą być długo żywe; są serializowane i deserializowane, ponieważ aplikacja zatrzymuje się i uruchamia się, więc stan aplikacji jest stały między kolejnymi uruchomieniami.

Mój oryginalny projekt miał obrazy zapisane w piaskownicy aplikacji. Jeśli zostanie wykonana jakakolwiek edycja, obraz zostanie po prostu przepisany na lokalny plik. Jeśli jednak pakiet zawiera dużo obrazów, może to spowodować niepotrzebne powielenie zawartości obrazu, co spowoduje mniej niż optymalne wykorzystanie "systemu plików".

Moje przeprojektowanie ma to teraz, że jeśli obraz pochodzi z biblioteki zasobów, po prostu przechowuję adres URL zasobu i pobiera go, ilekroć zajdzie potrzeba wyświetlenia obrazu lub jego zawartości. Kiedy użytkownik edytuje obraz, jest on zapisywany w lokalnej piaskownicy, tak jak w moim oryginalnym projekcie. Moja aplikacja śledzi, czy obraz pochodzi z lokalnego systemu plików lub biblioteki zasobów.

Mój problem powstaje, gdy moja aplikacja NIE jest aktywna. Użytkownik jest całkowicie zdolny do korzystania z aplikacji Zdjęcia i usuwania zdjęć bez zmian - w tym obrazów, do których moja aplikacja zapisywała wskaźniki adresu URL.

Zrobiłem "Co jeśli?" przetestuj, aby zobaczyć, co stanie się w mojej aplikacji, gdyby użytkownik zrobił coś takiego. To, co zobaczyłem, było nieco nieoczekiwane. Napisałem obsługi, który poprowadzi listę wiązki, sprawdzając wszystkie obrazy, które mają adresy aktywów stosując następujący kod:

[assetLibrary 
    assetForURL:url 
    resultBlock:^(ALAsset *asset) { 
     _image = [UIImage imageWithCGImage:[[asset defaultRepresentation] fullResolutionImage]]; 
     // ... everything works! 
    } 
    failureBlock:^(NSError *error) { 
     NSLog(@"Asset verify failed"); 
     if (_image != nil) { 
      // I already have a reference to the UIImage... write it locally 
     } else { 
      // Image is nil and we have an empty image. 
     } 
    }]; 

W moich testów, nigdy nie dotrzeć do bloku awaryjności. Dokumentacja Apple mówi: "Jeśli użytkownik odmówi dostępu do aplikacji lub jeśli żadna aplikacja nie ma dostępu do danych, zostanie wywołany blok błędu:" Nie wiadomo, co się stanie, gdy adres URL nie istnieje. Rzeczywiście, moje testy pokazują, że coś pisze wiadomość NSLog(), że "Nie można znaleźć zasobu o UUID XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX" (XXX zostaną zastąpione przez UUID w oryginalnym adresie URL). To jednak nie jest wystarczająco złe. Nadal widzę obraz z UIImageView, który miałem na kontrolerze widoku na ekranie, a kiedy pop-view kontroler do rodzica, otrzymuję reset systemu.

Moje pytanie brzmi, czy istnieje sposób sprawdzenia, czy URL zasobu rzeczywiście istnieje? Nie przeszkadza mi, jeśli muszę usunąć obraz (w końcu to użytkownik usunął obraz!). Nie podoba mi się pomysł posiadania znanej ścieżki behawioralnej, która konsekwentnie spowoduje ponowne uruchomienie urządzenia; Nie mogę przesłać aplikacji z tym zachowaniem do sklepu App Store.

Wszelkie sugestie? Podczas gdy czekam na odpowiedzi, nadal będę przeprowadzał własne testy niektórych pomysłów, ale mogę wykorzystać wszelkie sugestie, które ludzie mogą mi w tym pomóc.

Dzięki!

+0

dla Apple iOS5 zapewnia kwerendę metod NSURL w klasie NSURL.# checkResourceIsReachableAndReturnError: # - isFileReferenceURL # - isFileURL. Nie użyłem go, ale może to pomóc. – Ravin

+0

Prosty test pokazał, że: "[url checkResourceIsReachableAndReturnError: & error]' zawsze zwraca NO dla zasobów, niezależnie od tego, czy istnieją, czy nie. Jakieś inne pomysły? – lar3ry

+0

Pozostałe dwa zapytania również zawsze zwracają NO w przypadku adresów URL zasobów. – lar3ry

Odpowiedz

5

Miałem podobny problem - w wynikuBlokowałem Sprawdziłem parametr aktywów dla zera - jeśli jest zerowy, to zasób nie został znaleziony.

Powiązane problemy