2013-06-08 26 views
10

Tôi đang cố gắng lấy tất cả hình ảnh có trong photos.app và hiển thị chúng trong UICollectionView. Tôi có mã này để lấy lại hình ảnh:ALAssetPrivate trong suốt vòng đời của việc sở hữu ALAssetsLibrary

ALAssetsLibrary *al = [ViewController defaultAssetsLibrary]; 

ALAssetsGroupEnumerationResultsBlock groupEnumerAtion = ^(ALAsset *result, NSUInteger index, BOOL *stop){ 

    if (result!=NULL) { 

     if ([[result valueForProperty:ALAssetPropertyType] isEqualToString:ALAssetTypePhoto]) { 

      [imagesGotFromUserLibrary addObject:result]; 
     } 

    } 
}; 

ALAssetsLibraryGroupsEnumerationResultsBlock 
libraryGroupsEnumeration = ^(ALAssetsGroup* group, BOOL* stop){ 
    [group setAssetsFilter:[ALAssetsFilter allPhotos]]; 

    if (group!=nil) 
    { 

     [group enumerateAssetsUsingBlock:groupEnumerAtion]; 
    } 
    else 
    { 

     dispatch_async(dispatch_get_global_queue(0, 0), ^{ 
      GalleryCollectionViewController *otherController = [[GalleryCollectionViewController alloc] init]; 
      [otherController receiveImagesWithMutableArray:imagesGotFromUserLibrary]; 

     }); 
    } 

}; 



al = [[ALAssetsLibrary alloc] init]; 
[al enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos 
         usingBlock:libraryGroupsEnumeration 
        failureBlock:^(NSError *error){ 
         NSLog(@"ERROR: %@", error); 
        }]; 

này nằm trong viewDidLoad và sau đó:

+ (ALAssetsLibrary *)defaultAssetsLibrary { 
static dispatch_once_t pred = 0; 
static ALAssetsLibrary *library = nil; 
dispatch_once(&pred, ^{ 
    library = [[ALAssetsLibrary alloc] init]; 
}); 
return library; 
} 

Đoạn mã này đang gửi một mảng khác điều khiển mà sẽ thiết lập các hình ảnh để UICollectionView của tôi . Vấn đề là tôi đang gặp lỗi "cố gắng không hợp lệ để truy cập trong suốt vòng đời của việc sở hữu ALAssetsLibrary" và nếu tôi cố gắng NSLog mảng của tôi, kết quả là "ALAsset - Type: Unknown, URLs: (null)".

Tôi đã tra cứu trên Internet và tìm thấy giải pháp. Tôi nên thêm dòng mã này nhưng nó không hoạt động. Mã này là:

+ (ALAssetsLibrary *)defaultAssetsLibrary { 
static dispatch_once_t pred = 0; 
static ALAssetsLibrary *library = nil; 
dispatch_once(&pred, ^{ 
    library = [[ALAssetsLibrary alloc] init]; 
}); 
return library; 
} 

Bất kỳ ai cũng có thể giúp tôi nhận URL chính xác của hình ảnh để hiển thị?

+0

(ALAssetsLibrary *) defaultAssetsPhương pháp thư viện charme cho tôi! – kb920

Trả lời

15

Giải pháp là luôn sử dụng cùng một thư viện cho tất cả các truy cập vào nội dung trên tất cả các lớp học của bạn. Giải pháp singleton bạn hiển thị ở trên là tốt - miễn là tất cả các lớp của bạn gọi là defaultAssetsLibrary và không có ai trong số họ phân bổ/init riêng của mình ALAssetsLibrary.

+0

Cảm ơn, nhưng điều này không may đã không giúp tôi. Tôi chỉ đi qua một mảng đến lớp khác. Tôi truy cập vào ALAssetsLibrary chỉ một lần và tôi không thể hiểu whats 'sai. Tôi không nghĩ rằng tôi đang tạo ra một trường hợp khác của nó nhưng có lẽ tôi đã sai. Bạn có thể kiểm tra lại mã của tôi không? :) – BalestraPatrick

+2

Bạn cần di chuyển phương thức defaultAssetsLibrary ở đâu đó chung để thư viện không bị hủy. Các đại biểu ứng dụng, hoặc bộ điều khiển xem đầu tiên (nếu nó đẩy bộ điều khiển xem thứ hai mà chọn các tài sản và gửi chúng trở lại đầu tiên). – Wain

1

Tôi gặp vấn đề tương tự. Và cuối cùng tôi đã giải quyết nó.

Đây là điều kiện của tôi: Tôi có hai bộ điều khiển, nút điều khiển thứ nhất sẽ chuyển sang chế độ thứ hai. Trong đầu tiên tôi khởi tạo thư viện sử dụng mã sau đây:

let library = ALAssetsLibrary() 

và tôi đặt tất cả các thông tin nhóm vào một mảng, vì vậy mà tôi có thể sử dụng chúng trong bộ điều khiển xem thứ hai. Nhưng điều này có thể dẫn đến không có ảnh trong nhóm.

và thông báo lỗi giống với thông báo lỗi của bạn.

Điều này là do thư viện được hệ thống phát hành. Và tất cả thông tin ảnh chỉ hợp lệ trong thời gian tồn tại của ALAssetsLibrary của chính nó. Vì vậy, nhóm.numberOfAssets() sẽ là 0.

Giải pháp là tránh thư viện được phát hành trước khi phát hành bộ điều khiển đầu tiên. Vì vậy, tôi sử dụng mã sau:

static let library = ALAssetsLibrary() 
firstViewController.library.enmurate.....balabala 

Hy vọng điều này có thể giúp ai đó.

Các vấn đề liên quan