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;
}
Ok, ale jak wrócę tak czy nie? Przepraszam, nie znam bloków ... – Mathieu
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
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