我问关于我的问题,这个问题在一个有效的方式iPhone显示photolibrary图像和高效的UITableView“cellForRowIndexPath”方法绑定的PhotoLibrary图像 。
所以我想请求答案不重复这一个没有阅读的详情如下:)
让我们来到这个问题,
我研究一下我上面提到的问题的详细,我已经找到关于操作队列中的文件从这里 。
因此,我已创建了一个示例应用程序,以显示通过ALAsset块使用操作队列7照片库的图像。
下面是示例应用程序的详细信息。
步骤1:
在NSOperationalQueueViewController viewDidLoad方法,我已经检索到的所有照片画廊ALAsset 的URL在名为数组urlArray
。
第2步:
在所有的网址添加到urlArray
中, 如果(组!=无)条件将在假assetGroupEnumerator
,所以我创建了一个NSOperationQueue
,然后成立了七个的UIImageView的通过for
循环和创造了我NSOperation
子类对象与相应的图像的视图和URL为每一个和它们加入到NSOperationQueue
。
见我NSOperation
子类在这里 。
见我的实现(VierwController)班 在这里 。
让我们来到这个问题。
它不是一直显示所有7张图像。 一些图像丢失。 丢失的顺序改变多次(一个时间它不会显示在第六和第七,和其他时间不显示只有在第二和第三)。 控制台日志显示找不到照片PIC编号 。 然而,URL被正确记录。
你可以看到日志的详细信息在这里 。
有没有在我的课什么错误?
此外,当我经过上述操作队列文件,我看了一下NSBlockOperation
。 我是否需要实施NSBlockOperation
代替NSOperation
在处理ALAsset块?
该NSBlockOperation
介绍说,
你使用一个类,是同时执行一个或多个模块中的对象。 因为它可以执行一个以上的块,块操作对象进行操作使用一组语义; 只有当所有相关的块已完成执行的操作本身才算完。
我怎样才能实现NSBlockOperation
与ALAsset块对我的示例应用程序?
我已经通过堆栈溢出的问题了学习NSBlockOperation 。 但是,我没有任何想法来实现NSBlockOperation
与ALAsset块!
您的DisplayImages的NSOperation子行,你更新UI(DisplayImages.m 54行):
self.imageView.image = topicImage;
此操作队列在后台线程上运行,而我们知道,你应该只在主线程中更新UI的状态。 由于更新的图像视图的视图肯定被更新UI,这可以简单地固定通过用包裹呼叫:
dispatch_async(dispatch_get_main_queue(), ^{
self.imageView.image = topicImage;
});
这给主队列的异步调用来更新与图像的UIImageView。 这是异步这样你的其他任务可以在后台进行调度,并且因为它是在主队列运行它的安全 - 这是主线程。
这是关于“如何使用ALAsset库访问来自iPhonePhoto库中的所有图像,并将它们显示的UIScrollView像iPhoneSimulator”教程。 首先,添加AssetsLibrary.framework
到您的项目。
然后在你的viewController.h
文件导入#import <AssetsLibrary/AssetsLibrary.h>
头文件。
这是你的viewController.h
文件
#import <UIKit/UIKit.h>
#import <AssetsLibrary/AssetsLibrary.h>
#import "AppDelegate.h"
@interface ViewController : UIViewController <UIScrollViewDelegate>
{
ALAssetsLibrary *assetsLibrary;
NSMutableArray *groups;
ALAssetsGroup *assetsGroup;
// I will show all images on `UIScrollView`
UIScrollView *myScrollView;
UIActivityIndicatorView *activityIndicator;
NSMutableArray *assetsArray;
// Will handle thumbnail of images
NSMutableArray *imageThumbnailArray;
// Will handle original images
NSMutableArray *imageOriginalArray;
UIButton *buttonImage;
}
-(void)displayImages;
-(void)loadScrollView;
@end
这是你的viewController.m
文件- viewWillAppear:
#import "ViewController.h"
#import <QuartzCore/QuartzCore.h>
@implementation ViewController
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
assetsArray = [[NSMutableArray alloc]init];
imageThumbnailArray = [[NSMutableArray alloc]init];
imageOriginalArray = [[NSMutableArray alloc]init];
myScrollView = [[UIScrollView alloc]initWithFrame:CGRectMake(0.0, 0.0, 320.0, 416.0)];
myScrollView.delegate = self;
myScrollView.contentSize = CGSizeMake(320.0, 416.0);
myScrollView.backgroundColor = [UIColor whiteColor];
activityIndicator = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
activityIndicator.center = myScrollView.center;
[myScrollView addSubview:activityIndicator];
[self.view addSubview:myScrollView];
[activityIndicator startAnimating];
}
viewDidAppear:
-(void)viewDidAppear:(BOOL)animated
{
if (!assetsLibrary) {
assetsLibrary = [[ALAssetsLibrary alloc] init];
}
if (!groups) {
groups = [[NSMutableArray alloc] init];
}
else {
[groups removeAllObjects];
}
ALAssetsLibraryGroupsEnumerationResultsBlock listGroupBlock = ^(ALAssetsGroup *group, BOOL *stop) {
//NSLog(@"group %@",group);
if (group) {
[groups addObject:group];
//NSLog(@"groups %@",groups);
} else {
//Call display Images method here.
[self displayImages];
}
};
ALAssetsLibraryAccessFailureBlock failureBlock = ^(NSError *error) {
NSString *errorMessage = nil;
switch ([error code]) {
case ALAssetsLibraryAccessUserDeniedError:
case ALAssetsLibraryAccessGloballyDeniedError:
errorMessage = @"The user has declined access to it.";
break;
default:
errorMessage = @"Reason unknown.";
break;
}
};
[assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:listGroupBlock failureBlock:failureBlock];
}
这是displayImages:
方法体
-(void)displayImages
{
// NSLog(@"groups %d",[groups count]);
for (int i = 0 ; i< [groups count]; i++) {
assetsGroup = [groups objectAtIndex:i];
if (!assetsArray) {
assetsArray = [[NSMutableArray alloc] init];
}
else {
[assetsArray removeAllObjects];
}
ALAssetsGroupEnumerationResultsBlock assetsEnumerationBlock = ^(ALAsset *result, NSUInteger index, BOOL *stop) {
if (result) {
[assetsArray addObject:result];
}
};
ALAssetsFilter *onlyPhotosFilter = [ALAssetsFilter allPhotos];
[assetsGroup setAssetsFilter:onlyPhotosFilter];
[assetsGroup enumerateAssetsUsingBlock:assetsEnumerationBlock];
}
//Seprate the thumbnail and original images
for(int i=0;i<[assetsArray count]; i++)
{
ALAsset *asset = [assetsArray objectAtIndex:i];
CGImageRef thumbnailImageRef = [asset thumbnail];
UIImage *thumbnail = [UIImage imageWithCGImage:thumbnailImageRef];
[imageThumbnailArray addObject:thumbnail];
ALAssetRepresentation *representation = [asset defaultRepresentation];
CGImageRef originalImage = [representation fullResolutionImage];
UIImage *original = [UIImage imageWithCGImage:originalImage];
[imageOriginalArray addObject:original];
}
[self loadScrollView];
}
现在你有两个array
一个是imageThumbnailArray
,另一个是imageOriginalArray
。 使用imageThumbnailArray
表示第UIScrollView
针对您的滚动将不急不慢....和使用imageOriginalArray
进行图像的放大预览。
“loadScrollView:”方法,这是如何在图像UIScrollView
像iPhoneSimulator
#pragma mark - LoadImages on UIScrollView
-(void)loadScrollView
{
float horizontal = 8.0;
float vertical = 8.0;
for(int i=0; i<[imageThumbnailArray count]; i++)
{
if((i%4) == 0 && i!=0)
{
horizontal = 8.0;
vertical = vertical + 70.0 + 8.0;
}
buttonImage = [UIButton buttonWithType:UIButtonTypeCustom];
[buttonImage setFrame:CGRectMake(horizontal, vertical, 70.0, 70.0)];
[buttonImage setTag:i];
[ buttonImage setImage:[imageThumbnailArray objectAtIndex:i] forState:UIControlStateNormal];
[buttonImage addTarget:self action:@selector(buttonImagePressed:) forControlEvents:UIControlEventTouchUpInside];
[myScrollView addSubview:buttonImage];
horizontal = horizontal + 70.0 + 8.0;
}
[myScrollView setContentSize:CGSizeMake(320.0, vertical + 78.0)];
[activityIndicator stopAnimating];
[activityIndicator removeFromSuperview];
}
在这里,你可以找到哪个图像button
被点击-
#pragma mark - Button Pressed method
-(void)buttonImagePressed:(id)sender
{
NSLog(@"you have pressed : %d button",[sender tag]);
}
希望本教程将帮助您和谁搜索相同的众多用户。谢谢!
文章来源: NSBlockOperation or NSOperation with ALAsset Block to display photo-library images using ALAsset URL