Skip to content

Commit

Permalink
Performance improvement.
Browse files Browse the repository at this point in the history
  • Loading branch information
arturgrigor committed Mar 12, 2012
1 parent 01d4b88 commit 11eb92f
Show file tree
Hide file tree
Showing 10 changed files with 171 additions and 83 deletions.
2 changes: 1 addition & 1 deletion AGImagePickerController Demo/AGViewController.m
Expand Up @@ -173,7 +173,7 @@ - (void)openAction:(id)sender
[selectAll release];
[deselectAll release];

imagePickerController.maximumNumberOfPhotos = 3;
// imagePickerController.maximumNumberOfPhotos = 3;
[self presentModalViewController:imagePickerController animated:YES];
[imagePickerController release];
}
Expand Down
2 changes: 1 addition & 1 deletion AGImagePickerController/AGIPCAlbumsController.h
Expand Up @@ -18,6 +18,6 @@
UITableView *tableView;
}

@property (nonatomic, retain) IBOutlet UITableView *tableView;
@property (retain) IBOutlet UITableView *tableView;

@end
6 changes: 3 additions & 3 deletions AGImagePickerController/AGIPCAssetsController.h
Expand Up @@ -22,10 +22,10 @@
NSMutableArray *assets;
}

@property (nonatomic, retain) ALAssetsGroup *assetsGroup;
@property (nonatomic, retain) IBOutlet UITableView *tableView;
@property (retain) ALAssetsGroup *assetsGroup;
@property (retain) IBOutlet UITableView *tableView;

@property (nonatomic, readonly) NSArray *selectedAssets;
@property (readonly) NSArray *selectedAssets;

- (id)initWithAssetsGroup:(ALAssetsGroup *)theAssetsGroup;

Expand Down
68 changes: 46 additions & 22 deletions AGImagePickerController/AGIPCAssetsController.m
Expand Up @@ -66,14 +66,29 @@ - (BOOL)toolbarHidden

- (void)setAssetsGroup:(ALAssetsGroup *)theAssetsGroup
{
if (assetsGroup != theAssetsGroup)
@synchronized (self)
{
[assetsGroup release];
assetsGroup = [theAssetsGroup retain];
[assetsGroup setAssetsFilter:[ALAssetsFilter allPhotos]];
if (assetsGroup != theAssetsGroup)
{
[assetsGroup release];
assetsGroup = [theAssetsGroup retain];
[assetsGroup setAssetsFilter:[ALAssetsFilter allPhotos]];

[self reloadData];
}
}
}

[self reloadData];
- (ALAssetsGroup *)assetsGroup
{
ALAssetsGroup *ret = nil;

@synchronized (self)
{
ret = [[assetsGroup retain] autorelease];
}

return ret;
}

- (NSArray *)selectedAssets
Expand Down Expand Up @@ -190,8 +205,6 @@ - (void)viewWillAppear:(BOOL)animated
[AGIPCGridItem performSelector:@selector(resetNumberOfSelections)];

[super viewWillAppear:animated];

[self.navigationController setToolbarHidden:[self toolbarHidden] animated:YES];
}

- (void)viewDidLoad
Expand Down Expand Up @@ -267,23 +280,27 @@ - (void)loadAssets
{
[self.assets removeAllObjects];

__block AGIPCAssetsController *blockSelf = self;

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{

[self.assetsGroup enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {

if (result == nil)
{
return;
}

AGIPCGridItem *gridItem = [[AGIPCGridItem alloc] initWithAsset:result andDelegate:self];
[self.assets addObject:gridItem];
[gridItem release];
}];
@autoreleasepool {
[blockSelf.assetsGroup enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {

if (result == nil)
{
return;
}

AGIPCGridItem *gridItem = [[AGIPCGridItem alloc] initWithAsset:result andDelegate:blockSelf];
[blockSelf.assets addObject:gridItem];
[gridItem release];
}];
}

dispatch_async(dispatch_get_main_queue(), ^{

[self reloadData];
[blockSelf reloadData];

});

Expand All @@ -292,6 +309,9 @@ - (void)loadAssets

- (void)reloadData
{
// Don't display the select button until all the assets are loaded.
[self.navigationController setToolbarHidden:[self toolbarHidden] animated:YES];

[self.tableView reloadData];
[self setTitle:[self.assetsGroup valueForProperty:ALAssetsGroupPropertyName]];
[self changeSelectionInformation];
Expand Down Expand Up @@ -325,9 +345,13 @@ - (void)customBarButtonItemAction:(id)sender
if (((AGIPCToolbarItem *)item).barButtonItem == sender)
{
if (((AGIPCToolbarItem *)item).assetIsSelectedBlock) {
[self.assets enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
((AGIPCGridItem *)obj).selected = ((AGIPCToolbarItem *)item).assetIsSelectedBlock(idx, ((AGIPCGridItem *)obj).asset);
}];

NSUInteger idx = 0;
for (AGIPCGridItem *obj in self.assets) {
obj.selected = ((AGIPCToolbarItem *)item).assetIsSelectedBlock(idx, ((AGIPCGridItem *)obj).asset);
idx++;
}

}
}
}
Expand Down
2 changes: 1 addition & 1 deletion AGImagePickerController/AGIPCGridCell.h
Expand Up @@ -18,6 +18,6 @@

- (id)initWithItems:(NSArray *)theItems reuseIdentifier:(NSString *)theIdentifier;

@property (nonatomic, retain) NSArray *items;
@property (retain) NSArray *items;

@end
29 changes: 22 additions & 7 deletions AGImagePickerController/AGIPCGridCell.m
Expand Up @@ -23,18 +23,33 @@ @implementation AGIPCGridCell

- (void)setItems:(NSArray *)theItems
{
if (items != theItems)
@synchronized (self)
{
for (UIView *view in [self subviews])
{
[view removeFromSuperview];
if (items != theItems)
{
for (UIView *view in [self subviews])
{
[view removeFromSuperview];
}

[items release];
items = [theItems retain];
}

[items release];
items = [theItems retain];
}
}

- (NSArray *)items
{
NSArray *array = nil;

@synchronized (self)
{
array = [[items retain] autorelease];
}

return array;
}

#pragma mark - Object Lifecycle

- (void)dealloc
Expand Down
4 changes: 2 additions & 2 deletions AGImagePickerController/AGIPCGridItem.h
Expand Up @@ -38,8 +38,8 @@
id<AGIPCGridItemDelegate> delegate;
}

@property (nonatomic, assign) BOOL selected;
@property (nonatomic, retain) ALAsset *asset;
@property (assign) BOOL selected;
@property (retain) ALAsset *asset;

@property (nonatomic, assign) id<AGIPCGridItemDelegate> delegate;

Expand Down
104 changes: 69 additions & 35 deletions AGImagePickerController/AGIPCGridItem.m
Expand Up @@ -31,53 +31,87 @@ @implementation AGIPCGridItem

- (void)setSelected:(BOOL)isSelected
{
if (selected != isSelected)
@synchronized (self)
{
if (isSelected) {
// Check if we can select
if ([self.delegate respondsToSelector:@selector(agGridItemCanSelect:)])
if (selected != isSelected)
{
if (isSelected) {
// Check if we can select
if ([self.delegate respondsToSelector:@selector(agGridItemCanSelect:)])
{
if (![self.delegate agGridItemCanSelect:self])
return;
}
}

selected = isSelected;

self.selectionView.hidden = !selected;
self.checkmarkImageView.hidden = !selected;

if (selected)
{
if (![self.delegate agGridItemCanSelect:self])
return;
numberOfSelectedGridItems++;
}
else
{
if (numberOfSelectedGridItems > 0)
numberOfSelectedGridItems--;
}

dispatch_async(dispatch_get_main_queue(), ^{

if ([self.delegate respondsToSelector:@selector(agGridItem:didChangeSelectionState:)])
{
[self.delegate performSelector:@selector(agGridItem:didChangeSelectionState:) withObject:self withObject:[NSNumber numberWithBool:selected]];
}

if ([self.delegate respondsToSelector:@selector(agGridItem:didChangeNumberOfSelections:)])
{
[self.delegate performSelector:@selector(agGridItem:didChangeNumberOfSelections:) withObject:self withObject:[NSNumber numberWithUnsignedInteger:numberOfSelectedGridItems]];
}

});
}

selected = isSelected;

self.selectionView.hidden = !selected;
self.checkmarkImageView.hidden = !selected;

if (selected)
{
numberOfSelectedGridItems++;
}
else
{
if (numberOfSelectedGridItems > 0)
numberOfSelectedGridItems--;
}

if ([self.delegate respondsToSelector:@selector(agGridItem:didChangeSelectionState:)])
{
[self.delegate performSelector:@selector(agGridItem:didChangeSelectionState:) withObject:self withObject:[NSNumber numberWithBool:selected]];
}

if ([self.delegate respondsToSelector:@selector(agGridItem:didChangeNumberOfSelections:)])
}
}

- (BOOL)selected
{
BOOL ret;

@synchronized (self)
{
ret = selected;
}

return ret;
}

- (void)setAsset:(ALAsset *)theAsset
{
@synchronized (self)
{
if (asset != theAsset)
{
[self.delegate performSelector:@selector(agGridItem:didChangeNumberOfSelections:) withObject:self withObject:[NSNumber numberWithUnsignedInteger:numberOfSelectedGridItems]];
[asset release];
asset = [theAsset retain];

self.thumbnailImageView.image = [UIImage imageWithCGImage:asset.thumbnail];
}
}
}

- (void)setAsset:(ALAsset *)theAsset
- (ALAsset *)asset
{
if (asset != theAsset)
ALAsset *ret = nil;

@synchronized (self)
{
[asset release];
asset = [theAsset retain];

self.thumbnailImageView.image = [UIImage imageWithCGImage:asset.thumbnail];
ret = [[asset retain] autorelease];
}

return ret;
}

#pragma mark - Object Lifecycle
Expand Down
4 changes: 2 additions & 2 deletions AGImagePickerController/AGImagePickerController.h
Expand Up @@ -41,8 +41,8 @@ typedef void (^AGIPCDidFail)(NSError *error);
NSArray *toolbarItemsForSelection;
}

@property (nonatomic, assign) BOOL shouldChangeStatusBarStyle;
@property (nonatomic, assign) BOOL shouldDisplaySelectionInformation;
@property (assign) BOOL shouldChangeStatusBarStyle;
@property (assign) BOOL shouldDisplaySelectionInformation;
@property NSUInteger maximumNumberOfPhotos;

@property (nonatomic, assign) id delegate;
Expand Down
33 changes: 24 additions & 9 deletions AGImagePickerController/AGImagePickerController.m
Expand Up @@ -37,18 +37,33 @@ @implementation AGImagePickerController

- (void)setShouldChangeStatusBarStyle:(BOOL)theShouldChangeStatusBarStyle
{
if (shouldChangeStatusBarStyle != theShouldChangeStatusBarStyle)
@synchronized (self)
{
shouldChangeStatusBarStyle = theShouldChangeStatusBarStyle;

if (shouldChangeStatusBarStyle)
if (IS_IPAD())
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackOpaque animated:YES];
if (shouldChangeStatusBarStyle != theShouldChangeStatusBarStyle)
{
shouldChangeStatusBarStyle = theShouldChangeStatusBarStyle;

if (shouldChangeStatusBarStyle)
if (IS_IPAD())
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackOpaque animated:YES];
else
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackTranslucent animated:YES];
else
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackTranslucent animated:YES];
else
[[UIApplication sharedApplication] setStatusBarStyle:oldStatusBarStyle animated:YES];
[[UIApplication sharedApplication] setStatusBarStyle:oldStatusBarStyle animated:YES];
}
}
}

- (BOOL)shouldChangeStatusBarStyle
{
BOOL should;

@synchronized (self)
{
should = shouldChangeStatusBarStyle;
}

return should;
}

+ (ALAssetsLibrary *)defaultAssetsLibrary
Expand Down

0 comments on commit 11eb92f

Please sign in to comment.