如何从nsmutableArray中删除重复数据

时间:2013-04-19 06:28:07

标签: iphone ios objective-c ios5 ios6

您好Iam与Iphone Photo Library合作。我从AssetFramework的照片库中获得了所有照片。我在滚动视图中显示这些照片并且完美显示并且图像计数假定为6.然后当我点击单个图像时,它将显示大图像。它也完成了。我的问题是“当点击图像显示为大数时,计数为12(重复计数)。”

我使用下面的代码来获取图片:

 - (void)createScrollView
 {

@try
{
    NSLog(@"in create scrollview");

    //add views to scrolview
   // UIImageView *backgroundImgView;
    int x=5;
    int y=7;
    NSLog(@"assetsArray/count/createScrollview %d",assetsArray.count);
    for (int i=0;i<[assetsArray count];i++)
    {
        UIView *userView=[[UIView alloc] initWithFrame:CGRectMake(x, y, 70, 80)];
        userView.tag=i;
        UIImageView *backgroundImgView=[[UIImageView alloc] initWithFrame:CGRectMake(1, 1, 70, 70)];

        backgroundImgView.tag=1;

        // [backgroundImgView setImageWithURL:[NSURL URLWithString:[urlString stringByAddingPercentEscapesUsingEncoding:NSUTF16BigEndianStringEncoding]] placeholderImage:[UIImage imageNamed:@"NoImage.png"]];

        //-------------Getting Images from AssetsLibrary ----------
        ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset)
        {
            galleryObj=[[GalleryObject alloc]init];
            ALAssetRepresentation *rep = [myasset defaultRepresentation];
            CGImageRef iref = [rep fullResolutionImage];
            UIImage *assetsLibraryImage;
            if (iref)
            {
                assetsLibraryImage = [UIImage imageWithCGImage:iref scale:[rep scale] orientation:(UIImageOrientation)[rep orientation]];
                galleryObj.galleryImage=assetsLibraryImage;

            }
            else
            {
                assetsLibraryImage = [UIImage imageNamed:@"NoImage.png"];
            }
            //[set addObject:[NSString stringWithFormat:@"1"]];
            [uniqueSet addObject:galleryObj];
            NSLog(@"uniqueSet data is .....%@",uniqueSet); // Output (3,1,4,2,5) ... all objects

            [imagesArray addObject:galleryObj];
            NSLog(@"imagesArray/resultBlock count is %d array is %@....",imagesArray.count,imagesArray);

            backgroundImgView.image=assetsLibraryImage;
        };


        ALAsset *al_asset = [assetsArray objectAtIndex:i];
        //NSLog(@"al_asset is ......%@",al_asset);
        al_assetUrl=al_asset.defaultRepresentation.url;
        //NSLog(@"al_assetUrl is %@",al_assetUrl);

        ALAssetsLibraryAccessFailureBlock failureblock  = ^(NSError *myerror)
        {
            NSLog(@"ALAssetsLibraryAccessFailureBlock");
        };

        ALAssetsLibrary* assetslibrary = [[ALAssetsLibrary alloc] init];
        [assetslibrary assetForURL:al_assetUrl resultBlock:resultblock failureBlock:failureblock];


        //-------------Getting Images from AssetsLibrary ----------
        UIButton *userButton=[[UIButton alloc]initWithFrame:CGRectMake(1, 1, 70,70)];
        [userButton addTarget:self action:@selector(userImageClicked:) forControlEvents:UIControlEventTouchUpInside];
        userButton.tag=i;

                 [userView addSubview:backgroundImgView];
        [userView addSubview:userButton];

        [self.galleryScrollview addSubview:userView];

        x+=79;

        if ((i+1)%4==0)
        {
            //if added image is 4th image
            y+=80;
            x=5;
        }
       // [activity stopAnimating]; 

    }

    if (y+100>self.galleryScrollview.frame.size.height)
    {
        self.galleryScrollview.contentSize=CGSizeMake(320, y+100);
    }

    else
    {
        self.galleryScrollview.contentSize=CGSizeMake(320, self.galleryScrollview.frame.size.height+60);
    }
}
@catch (NSException *exception)
{
    NSLog(@"exception is %@",exception);
}

}

请注意我在上面的方法中创建了按钮和动作是userImageClicked。当我点击userImageClicked按钮时,数组计数是双倍的。

我不知道为什么会这样。我尝试使用containsObject方法删除重复项。但没用。

在上述方法中,我将UIImage保存在objectclass中,并将该对象分配给imagesArray

我还将NSMutableSet用于存储值,但它也没用。

请任何人建议解决我的问题。

4 个答案:

答案 0 :(得分:1)

这是删除重复数据的方法:

NSArray *copy = [mutableArray copy];
NSInteger index = [copy count] - 1;
for (id object in [copy reverseObjectEnumerator]) {
    if ([mutableArray indexOfObject:object inRange:NSMakeRange(0, index)] != NSNotFound) {
        [mutableArray removeObjectAtIndex:index];
    }
    index--;
}

请相应地使用它......

更简单的方法:

NSMutableArray *unique = [NSMutableArray array];

for (id obj in originalArray) {
    if (![unique containsObject:obj]) {
        [unique addObject:obj];
    }
}

答案 1 :(得分:0)

如果上面是将图像添加到imagesArray的唯一方法,那么请尝试检查您是否从任何位置调用了两次,否则请检查imagesArray是否未从其他任何位置更新。

如果您需要多次调用此方法createScrollView,请编写代码以分别在imagesArray中添加图片。

答案 2 :(得分:0)

问题在于galleryObj的创建。 您为每个图像创建一个新对象。 因此,galleryObj的每个实例都是唯一的。

无论你使用NSM of NSMutableArray还是NSWhatever,他们都不会知道里面 galleryObj对象是同一个UIImage。

ALAssetRepresentation的Apple documentation声明它封装了一个表示形式。因此,如果同时保存了JGP和RAW图片,您将获得同一图片的两个单独的表示。

在这种情况下,您必须忽略一种或另一种类型。我不建议将RAW图片与JPG图片(; - )进行比较。

答案 3 :(得分:0)

嗨感谢所有人的快速回复。 3个小时后我解决了我的问题。我得到了完全相同的副本,因此我使用下面的代码删除了重复项。我知道这不是好代码。但它解决了我的问题。

if([imagesArray count]>0)
{
    int dupCount=[imagesArray count]/2;
    int imagesArrayCount=[imagesArray count];
    for(int i=dupCount;dupCount<imagesArrayCount;dupCount++)
    {
        [imagesArray removeObjectAtIndex:i];
    }

}

我也找到了重复数据的原因?答案是我使用了块码,它正在调用两次。这样该数组包含双数据值。

谢谢大家..