2011-08-28 7 views
11

Mam tablicę zawierającą adresy URL ALAsset (nie pełne obiekty ALAsset) Tak więc za każdym razem, gdy uruchamiam moją aplikację, chcę sprawdzić moją tablicę, aby sprawdzić, czy to wciąż zależy od data ...Jak sprawdzić, czy zestaw ALA nadal istnieje przy użyciu adresu URL?

Więc próbowałem

NSData *assetData = [[NSData alloc] initWithContentsOfFile:@"assets-library://asset/asset.PNG?id=1000000001&ext=PNG"]; 

ale assetData jest zawsze dobrze nil

thx za pomoc

Odpowiedz

21

Zastosowanie assetForURL: resultBl ock: failureBlock: metoda ALAssetsLibrary zamiast pobierać zasób z adresu URL.

// Create assets library 
ALAssetsLibrary *library = [[[ALAssetsLibrary alloc] init] autorelease]; 

// Try to load asset at mediaURL 
[library assetForURL:mediaURL resultBlock:^(ALAsset *asset) { 
    // If asset exists 
    if (asset) { 
     // Type your code here for successful 
    } else { 
     // Type your code here for not existing asset 
    } 
} failureBlock:^(NSError *error) { 
    // Type your code here for failure (when user doesn't allow location in your app) 
}]; 
+1

Ok, ale jak wrócę tak czy nie? Przepraszam, nie znam bloków ... – Mathieu

+0

Czy możesz mi powiedzieć, co chcesz robić? Te bloki są nazywane asynchronicznie, więc zamiast zwracać wartość, powinieneś zamiast tego umieścić kod, który potrzebuje zasobu w metodzie i wywołać tę metodę w bloku lub możesz umieścić kod bezpośrednio w bloku. – Johnmph

+0

Chcę pętli na mojej tablicy assetUrl, aby sprawdzić, czy zasób nadal istnieje, a jeśli nie chcę go usunąć z listy i usunąć buforowane pliki – Mathieu

7

Mając ścieżka aktywa można użyć tej funkcji, aby sprawdzić, czy obraz istnieje:

-(BOOL) imageExistAtPath:(NSString *)assetsPath 
{ 
    __block BOOL imageExist = NO; 
    ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; 
    [library assetForURL:[NSURL URLWithString:assetsPath] resultBlock:^(ALAsset *asset) { 
     if (asset) { 
      imageExist = YES; 
      } 
    } failureBlock:^(NSError *error) { 
     NSLog(@"Error %@", error); 
    }]; 
    return imageExist; 
} 

Pamiętaj, że sprawdzenie, czy obraz jest sprawdzenie asynchronyus istnieć. Jeśli chcesz czekać do nowego wątku dokończyć rozmowę życie funkcję „imageExistAtPath” w głównym wątku:

dispatch_async(dispatch_get_main_queue(), ^{ 
    [self imageExistAtPath:assetPath]; 
}); 

Albo można użyć semaforów, ale nie jest to bardzo miłe rozwiązanie:

-(BOOL) imageExistAtPath:(NSString *)assetsPath 
{ 
    __block BOOL imageExist = YES; 
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); 
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0); 
    dispatch_async(queue, ^{ 
     ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; 
     [library assetForURL:[NSURL URLWithString:assetsPath] resultBlock:^(ALAsset *asset) { 
      if (asset) { 
       dispatch_semaphore_signal(semaphore); 
      } else { 
       imageExist = NO; 
       dispatch_semaphore_signal(semaphore); 
       } 
     } failureBlock:^(NSError *error) { 
      NSLog(@"Error %@", error); 
     }]; 
    }); 
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); 
    return imageExist; 
} 
+2

Dla tych, którzy się na tym natknęli, uważam, że to w rzeczywistości niepoprawne. Jak zauważysz, 'assetForURL: resultBlock: failureBlock': wywołuje bloki asynchronicznie, więc najprawdopodobniej dojdzie do' return imageExist' zanim zostanie wywołany resultBlock, a imageExist z pewnością zawsze jest NIE. – jcaron

3

Dla iOS 8 lub nowszy, istnieje synchroniczna metoda sprawdzania, czy istnieje ALAsset.

@import Photos; 

if ([PHAsset fetchAssetsWithALAssetURLs:@[assetURL] options:nil].count) { 
    // exist 
} 

Swift:

import Photos 

if PHAsset.fetchAssetsWithALAssetURLs([assetURL], options: nil).count > 0 { 
    // exist 
} 

Swift 3:

import Photos 

if PHAsset.fetchAssets(withALAssetURLs: [assetURL], options: nil).count > 0 { 
    // exist 
} 
+0

to pomoże mi sprawdzić, czy obraz istnieje w bibliotece zdjęć, czy też nie. Chciałbym udostępnić kod wersji Swift 2.0 poniżej. if (PHAsset.fetchAssetsWithALAssetURLs ([imageURL], options: nil) .count! = 0) –

+0

Czy to rozwiązanie działa również w przypadku zasobów wideo? –

+1

@SalmanKhakwani Tak, to powinno działać. – user3480295

0

Zastosowanie tej metody w celu sprawdzenia, czy plik istnieje

NSURL *yourFile = [[self applicationDocumentsDirectory]URLByAppendingPathComponent:@"YourFileHere.txt"]; 

if ([[NSFileManager defaultManager]fileExistsAtPath:storeFile.path 
isDirectory:NO]) { 

    NSLog(@"The file DOES exist"); 

} else { 

    NSLog(@"The file does NOT exist"); 
} 
Powiązane problemy