2011-08-28 32 views
11

Tôi có một mảng chứa các url ALAsset (không phải các đối tượng ALAsset đầy đủ) Vì vậy mỗi lần tôi khởi động ứng dụng của mình, tôi muốn kiểm tra mảng của mình ngày ...Làm cách nào để kiểm tra xem một ALAset có tồn tại hay không bằng cách sử dụng URL

vì vậy, tôi đã cố gắng

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

nhưng assetData là allways nil

thx cho sự giúp đỡ

Trả lời

21

Sử dụng assetForURL: resultBl ock: failureBlock: phương thức ALAssetsLibrary thay vào đó để lấy nội dung từ URL của nó.

// 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 nhưng làm thế nào để tôi trở YES hoặc NO? Xin lỗi, không quen thuộc với các khối ... – Mathieu

+0

Bạn có thể cho tôi biết bạn muốn làm gì không? Các khối này được gọi là không đồng bộ, vì vậy thay vì trả về một giá trị, bạn nên đặt mã cần nội dung trong phương thức và gọi phương thức này trong khối hoặc bạn có thể đặt mã trực tiếp trong khối. – Johnmph

+0

Tôi muốn lặp lại mảng assetUrl của mình để kiểm tra xem nội dung vẫn tồn tại và nếu không muốn xóa nó khỏi danh sách và xóa các tệp đã lưu trong bộ nhớ cache – Mathieu

7

Có tài sản đường dẫn mà bạn có thể sử dụng chức năng này để kiểm tra xem hình ảnh tồn tại:

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

Hãy nhớ rằng việc kiểm tra nếu hình ảnh tồn tại đang kiểm tra asynchronyus. Nếu bạn muốn đợi cho đến khi thread mới hoàn thành chức năng gọi cuộc đời mình "imageExistAtPath" trong chủ đề chính:

dispatch_async(dispatch_get_main_queue(), ^{ 
    [self imageExistAtPath:assetPath]; 
}); 

Hoặc bạn có thể sử dụng Cột, nhưng đây không phải là giải pháp rất tốt đẹp:

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

Đối với những người ngại ngùng về điều này, tôi tin rằng nó thực sự không chính xác. Như bạn chỉ ra, 'assetForURL: resultBlock: failureBlock': gọi các khối không đồng bộ, vì vậy nó có thể sẽ đạt đến' return imageExist' trước khi resultBlock được gọi và imageExist chắc chắn là luôn luôn NO. – jcaron

3

Đối iOS 8 trở lên, có một phương pháp đồng bộ để kiểm tra xem có tồn tại ALAsset hay không.

@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 
} 
+0

điều này giúp tôi kiểm tra xem hình ảnh có tồn tại trong thư viện ảnh hay không. Tôi muốn chia sẻ mã phiên bản Swift 2.0 bên dưới. nếu (PHAsset.fetchAssetsWithALAssetURLs ([imageURL], tùy chọn: nil) .count! = 0) –

+0

Giải pháp này có hoạt động đối với nội dung video không? –

+1

@SalmanKhakwani Có, nó sẽ hoạt động. – user3480295

0

Sử dụng phương pháp này để kiểm tra nếu tập tin tồn tại

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"); 
} 
Các vấn đề liên quan