ALAssetLibrary и iOS 5.0 - PullRequest
       2

ALAssetLibrary и iOS 5.0

2 голосов
/ 06 декабря 2011

Я написал простой метод для извлечения данных из библиотеки ресурсов, который отлично работает на iOS4.3, но с задержкой при загрузке изображений в iOS5. Что я должен сделать, чтобы ускорить процесс извлечения на iOS 5.

-(void)setImages
{
    int count =0;
    int photoNumber = [[templateDictionary objectForKey:@"ElementsOnPage"] intValue]; 
    for (int i=currentCount; count<photoNumber; i++) {
       [self data:count+1 count:i];
        count++;
    }
 }


-(void)data:(int)photoNumber count:(int)currentCount 
{  
NSURL *url;
UIImageView *firstImageView = [[UIImageView alloc]init];
CGFloat x,y,wid,h;
float ang;
 if (currentCount>=[ImageURLArray count]) {
    [firstImageView release];
    return;
}
else
{
    url = [NSURL URLWithString:[ImageURLArray objectAtIndex:currentCount]];
    switch (photoNumber) {
        case 1:
        {

            x = [[templateDictionary  objectForKey:@"FirstElement_X"]floatValue];
            y=[[templateDictionary objectForKey:@"FirstElement_Y"]floatValue];
            wid = [[templateDictionary objectForKey:@"FirstElement_Width"]floatValue];
            h=[[templateDictionary objectForKey:@"FirstElement_Height"]floatValue];
            ang =[[templateDictionary objectForKey:@"FirstElement_Angle"]floatValue];
            firstImageView.tag = 1+10;
            //FirstImage

        }
            break;
        case 2:
        {
            x = [[templateDictionary objectForKey:@"SecondElement_X"]floatValue];
            y=[[templateDictionary objectForKey:@"SecondElement_Y"]floatValue];
            wid = [[templateDictionary objectForKey:@"SecondElement_Width"]floatValue];
            h=[[templateDictionary objectForKey:@"SecondElement_Height"]floatValue];
            ang =[[templateDictionary objectForKey:@"SecondElement_Angle"]floatValue];
            firstImageView.tag=2+10;
            //SecondImage

        }
            break;
        case 3:
        {
            x = [[templateDictionary objectForKey:@"ThirdElement_X"]floatValue];
            y=[[templateDictionary objectForKey:@"ThirdElement_Y"]floatValue];
            wid = [[templateDictionary objectForKey:@"ThirdElement_Width"]floatValue];
            h=[[templateDictionary objectForKey:@"ThirdElement_Height"]floatValue];
            ang =[[templateDictionary objectForKey:@"ThirdElement_Angle"]floatValue];
            firstImageView.tag = 3+10;
            //ThirdImage
        }
            break;
        default:
            break;
    }
    [firstImageView setFrame:CGRectMake(x, y, wid, h)];

    dispatch_async(dispatch_get_main_queue(), ^
                   {
                       NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
                       ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
                       // Enumerate just the photos and videos group by using ALAssetsGroupSavedPhotos.

                       [library assetForURL:url 

                                resultBlock:^(ALAsset* asset) 
                        {

                            UIImage* img = [UIImage imageWithCGImage:[asset.defaultRepresentation fullResolutionImage]];
                            [firstImageView setImage:img];

                        }  
                               failureBlock:^(NSError* error) 
                        {
                            NSLog(@"error requesting asset");
                        }
                        ];

                       [library release];   

                       // Group enumerator Block
                       [pool release];
                   });


    if ([[contentType objectAtIndex:currentCount]isEqualToString:@"1"]) {
        UIButton *videoImage = [[UIButton alloc]initWithFrame:CGRectMake((firstImageView.frame.size.width/2)-25,(firstImageView.frame.size.height/2)-25,50,50)];
        videoImage.transform = CGAffineTransformMakeRotation(ang*(3.14/180));
        [videoImage setBackgroundImage:[UIImage imageNamed:@"videothumb.png"] forState:UIControlStateNormal];
        [videoImage addTarget:self action:@selector(PlayMusicOnClickofButton:) forControlEvents:UIControlEventTouchUpInside];
        [firstImageView addSubview:videoImage];
        videoImage.tag  = currentCount+1000;
        [videoImage release];
    }
}
firstImageView.transform = CGAffineTransformMakeRotation(ang*(3.14/180));
firstImageView.userInteractionEnabled = YES;
[coverImageView addSubview:firstImageView];
[coverImageView setImage:[UIImage imageNamed:innerBackground]];

[firstImageView release];

}

1 Ответ

2 голосов
/ 21 декабря 2011

Я уже сообщил об ошибке в Apple (после запроса сотрудника Apple на форумах разработчиков) о снижении производительности assetForUrl в iOS5.

Справочная информация: assetLibrary подвергался рефакторингу, и теперь он основан на CoreData; при каждом вызове assetForUrl SDK фактически открывает новое соединение SQLite (BAH ...), вызывая значительное снижение производительности.

Временное решение: в моем приложении мне нужно загрузить 200 фотографий с помощью assetForUrl. в IOS4 это заняло 100 мс, в iOS5 около 5+ секунд. Я обнаружил, что перечисление всей библиотеки (около 1500 фотографий) и ее кэширование в словаре URL-> ASSET занимает около 3 секунд. Я сейчас использую эту технику. Следите за устаревшими активами, если вы удерживаете их и происходят изменения в библиотеке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...