ALAssetLibrary ошибки из магазина приложений, но не в случае развертывания из XCode - PullRequest
0 голосов
/ 10 марта 2012

Мое приложение работает нормально при развертывании на моем iPhone через XCode, однако теперь, когда оно загружается в магазин приложений, происходит сбой.Должно быть, это сработало для Apple, так как это никогда не прошло бы проверку ????

Я пробовал другие телефоны, но они тоже дают сбой.При просмотре журналов сбоев приведенный ниже код вызывает озабоченность.

    dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
    // Do a tasks in the background
    library = [[ALAssetsLibrary alloc] init];   

    NSMutableArray *itemFileName = [[NSMutableArray alloc] init];

    for (Item *it in tag.Items) {
        [itemFileName addObject:it.name];
    }

    void (^assetEnumerator)( ALAsset *, NSUInteger, BOOL *) = ^(ALAsset *asset, NSUInteger index, BOOL *stop) {
        if(asset != NULL && [asset valueForProperty:ALAssetPropertyType] == ALAssetTypePhoto) {

            ALAssetRepresentation *rep = [asset defaultRepresentation];
            NSString *fileName = [rep filename];



            if ([itemFileName containsObject:fileName]) {
                AssetView *assetView = [[AssetView alloc] initWithAsset:asset];
                assetView.delegate = self;
                assetView.fileName = fileName;
                //assetView.index = counter;
                [self.assetViews addObject:assetView];
                //NSLog(@"%i",index);

            }

        }
    };

    void (^assetGroupEnumerator)( ALAssetsGroup *, BOOL *) =  ^(ALAssetsGroup *group, BOOL *stop) {
        if(group != nil) {
            [group enumerateAssetsUsingBlock:assetEnumerator];
        }
        else{
            //[self performSelectorOnMainThread:@selector(reloadTableView) withObject:nil waitUntilDone:YES];
            // Hide the HUD in the main tread 
            dispatch_async(dispatch_get_main_queue(), ^{
                [self reloadTableView];
                [MBProgressHUD hideHUDForView:self.navigationController.view animated:YES];
                [self loadImageTags];

                if([self.assetViews count] != [tag.Items count]){
                    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Info" 
                                                                    message:@"Some items have been deleted from the device. If none remain for this tag it will be deleted."  
                                                                   delegate:self 
                                                          cancelButtonTitle:nil 
                                                          otherButtonTitles: @"OK", nil];
                    [alert show];

                    MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES];
                    hud.labelText = @"Cleaning...";

                    dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
                        [self clearupOrphanedItems];

                        dispatch_async(dispatch_get_main_queue(), ^{
                            [MBProgressHUD hideHUDForView:self.navigationController.view animated:YES];
                        });

                    });
                }                
            });
        }
    };

    // Group Enumerator Failure Block
    void (^assetGroupEnumberatorFailure)(NSError *) = ^(NSError *error) {

        UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"Error" message:[NSString stringWithFormat:@"Album Error: %@ - %@", [error localizedDescription], [error localizedRecoverySuggestion]] delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil];
        [alert show];

        NSLog(@"A problem occured %@", [error description]);                                     
    };  

    // Enumerate Albums
    [library enumerateGroupsWithTypes:ALAssetsGroupAll
                           usingBlock:assetGroupEnumerator 
                         failureBlock:assetGroupEnumberatorFailure];   //HERE IS WHERE IT DIES!!!     

});

Я не уверен, что проблема связана с созданием экземпляра ALAssetLibrary внутри блока, так как он либо работает нормально во время отладкиили даже просто если развернуто на телефон через Xcode

Может кто-нибудь пролить свет на это для меня?

1 Ответ

0 голосов
/ 19 марта 2012

Чтобы избежать проблем coredata и threading, убедитесь, что: 1) вы создали только один alassetslibrary Instance для полного жизненного цикла приложения.Поэтому рекомендуется инициализировать свой экземпляр библиотеки ресурсов либо в приложении applelegate, либо с помощью dispatch_once 2) Убедитесь, что вы создали экземпляр alassetslibrary в главном потоке.

Ура,

Хендрик

...