NSOperationQueue выполняется в основном потоке на ios4, а не на io5? - PullRequest
1 голос
/ 17 ноября 2011

Есть ли причина, по которой NSOperationQueue работает в основном потоке на ios 4.2.1 и работает на отдельном потоке (как и ожидалось) на ios 5.0.1.

Я использую NSOperationQueue для выполнения занятой операции с большим количеством картинок (ALassets) при запуске моего приложения, но он запускается в главном потоке на ios4, а не на ios5 ...

Вот кусок кода

из основного потока:

    cacheManager = [[PicturesCacheManager alloc] initWithDelegate:self];
    //start the generation of the pictures array
    NSLOG(@"setUpToDatePicturesArray");
    operationQueue = [[NSOperationQueue alloc] init];
    [operationQueue addOperation:cacheManager];
    [cacheManager release];

Из PictureCacheManager:

- (id)initWithDelegate:(id <CachePicturesProtocol> )delegatePic
{
    self = [super init];
    if (self) {
        // Initialization code here.
        [self setDelegate:delegatePic];
    }

return self;
} 

-(void)main{
    [self loadCurrentCameraRoll]; //do lot of stuff 
}

-(void)loadCurrentCameraRoll{
//NSLOG(@"loadCurrentCameraRoll");
// photos
void (^assetEnumerator)( ALAsset *, NSUInteger, BOOL *) = ^(ALAsset *result, NSUInteger index, BOOL *stop) {
    //photos only!
    if(result != NULL && [[result valueForProperty:@"ALAssetPropertyType"] isEqualToString:@"ALAssetTypePhoto"]) {

        //Do stuff
    }
};

void (^assetGroupEnumerator)( ALAssetsGroup *, BOOL *) =  ^(ALAssetsGroup *group, BOOL *stop) {
    if(group != nil) {
        NSLOG(@"current group = %@", group);
        [group enumerateAssetsUsingBlock:assetEnumerator];
    }
    else{
        //we've enumerated all the groups

    }
};

assetsList = [[NSMutableArray alloc] init];
ALAssetsLibrary *library = [[[ALAssetsLibrary alloc] init] autorelease];

[library enumerateGroupsWithTypes:ALAssetsGroupAll
                       usingBlock:assetGroupEnumerator
                     failureBlock: ^(NSError *error) {
                         NSLOG(@"Failure : %@", [error description]);
                     }];

}

ОБНОВЛЕНИЕ: похоже, что дело в enumerateGroupsWithTypes: usingBlock: failBlock: метод. Прежде чем я это называю, я на самом деле в отдельном потоке, но после этого он переключается на основной поток ...

1 Ответ

1 голос
/ 17 ноября 2011

С здесь :

В iOS очереди операций не используют Grand Central Dispatch для выполнения операций. Они создают отдельные потоки для непараллельных операций и запускают параллельные операции из текущего потока.Для обсуждения различия между параллельными и не параллельными операциями и как они выполняются, см. Ссылку класса NSOperation.

Итак, NSOperationQueue всегда выполняется в отдельном потоке

...