2011-08-28 13 views
11

私はALAsset URL(完全なALAssetオブジェクトではない)を含む配列を持っています アプリケーションを起動するたびに配列をチェックして、日付...URLを使用してALAssetが存在するかどうかを確認する方法

は、だから私は

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

を試みたが、assetDataは助け

答えて

21

使用assetForURLため

THX nilをオールウェイズです:resultBl ock:failureBlock:URLからアセットを取得する代わりに、ALAssetsLibraryのメソッド。

// 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]を存在しますが、どのように私はYESを返すかNOかどうかをチェックするには?申し訳ありませんがブロックに精通していません... – 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のバージョンコードを共有したいと思います。 if(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"); 
} 
関連する問題