持つ資産パスあなたは画像が存在するかどうかを確認するために、この機能を使用することができます。
-(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;
}
[OK]を存在しますが、どのように私はYESを返すかNOかどうかをチェックするには?申し訳ありませんがブロックに精通していません... – Mathieu
あなたは何をしたいですか教えてくれますか?これらのブロックは非同期に呼び出されるため、値を返す代わりに、アセットを必要とするコードをメソッドに配置し、ブロック内でこのメソッドを呼び出すか、コードを直接ブロックに配置する必要があります。 – Johnmph
アセットがまだ存在するかどうかを確認するためにassetUrlの配列をループしたい場合は、リストから削除してキャッシュされたファイルを削除したい – Mathieu