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