2011-08-28 60 views
11

我有一个包含ALAsset网址的数组(不是完整的ALAsset对象) 因此,每次我启动我的应用程序时,我想检查一下我的数组是否仍然需要日期...如何检查一个ALAsset是否仍然存在使用URL

所以,我想

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

但assetData是零百达

THX的帮助

回答

21

使用assetForURL:resultBl ock: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) 
}]; 
+1

好吧,但我怎么回是或否?对不起,不熟悉块... – Mathieu

+0

你能告诉我你想做什么吗?这些块是异步调用的,所以不应该返回一个值,而应该将需要资源的代码放在方法中,并在块中调用此方法,或者直接将代码放入块中。 – Johnmph

+0

我想循环在我的数组assetUrl来检查资产是否仍然存在,如果不是我想从列表中删除它并删除缓存文件 – Mathieu

7

拥有资产路径,你可以使用此功能来检查是否存在图像:

-(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; 
} 

请记住,检查是否存在图像是检查asynchronyus。 如果你想等到新线程结束自己的生命通话功能“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; 
} 
+2

对于那些磕磕绊绊的人来说,我认为这实际上是不正确的。正如你指出的那样,'assetForURL:resultBlock:failureBlock':异步调用这些块,因此在resultBlock被调用之前它很可能会到达'return imageExist',并且imageExist肯定是NO。 – jcaron

3

对于iOS 8或更高版本中,有一种同步方法来检查ALAsset是否存在。

@import Photos; 

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

斯威夫特:

import Photos 

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

斯威夫特3:

import Photos 

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

这可以帮助我检查图片库中是否存在图片。我想分享下面的Swift 2.0版本代码。如果(PHAsset.fetchAssetsWithALAssetURLs([imageURL],options:nil).count!= 0) –

+0

此解决方案是否也适用于视频资产? –

+1

@SalmanKhakwani是的,它应该工作。 – user3480295

0

使用此方法来检查文件是否存在

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"); 
} 
相关问题