Как проверить, существует ли еще ALAset, используя URL-адрес
У меня есть массив, содержащий URL-адреса ALAsset (не полные объекты ALAsset)
Поэтому каждый раз, когда я запускаю свое приложение, я хочу проверить свой массив, чтобы убедиться, что он все еще обновлен...
Итак, я попробовал
NSData *assetData = [[NSData alloc] initWithContentsOfFile:@"assets-library://asset/asset.PNG?id=1000000001&ext=PNG"];
но propertyData всегда ноль
спасибо для справки
Ответы
Ответ 1
Использовать assetForURL: resultBlock: failureBlock: метод ALAssetsLibrary вместо этого, чтобы получить актив из его 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)
}];
Ответ 2
Имея путь к ресурсам, вы можете использовать эту функцию, чтобы проверить, существует ли изображение:
-(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;
}
Помните, что проверка наличия образа - проверка асинхронности.
Если вы хотите подождать, пока новый поток не завершит свою функцию вызова жизни "imageExistAtPath" в основном потоке:
dispatch_async(dispatch_get_main_queue(), ^{
[self imageExistAtPath:assetPath];
});
Или вы можете использовать семафоры, но это не очень хорошее решение:
-(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;
}
Ответ 3
Для iOS 8 или более поздних версий существует синхронный метод проверки наличия 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
}
Ответ 4
Используйте этот метод, чтобы проверить, существует ли файл
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");
}