NSOperationQueue работает в основном потоке на ios4, а не на io5?

Есть ли причина, по которой 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:failureBlock:. Прежде чем я назову это, я на самом деле в отдельном потоке, но после того, как он пройдет, он переключится на основной поток...


person Mathieu    schedule 17.11.2011    source источник
comment
Вы ошибаетесь. Пожалуйста, опубликуйте код, в котором вы создаете очередь и добавляете в нее операцию.   -  person JeremyP    schedule 17.11.2011
comment
хорошо, вот код. В основном loadCurrentCameraRoll сканирует cameraRoll и сохраняет эскизы в локальном каталоге.   -  person Mathieu    schedule 17.11.2011
comment
Вы переопределяете -isConcurrent ?   -  person hooleyhoop    schedule 17.11.2011
comment
Попробуйте записать значение [NSThread isMainThread] в свой метод main, просто чтобы убедиться, что он работает в основном потоке. Возможно ли, что вторичный поток запускается, но выполняет синхронные задачи в основном потоке (например, обновления пользовательского интерфейса).   -  person JeremyP    schedule 18.11.2011
comment
Хорошо, я попробовал, и я подтверждаю, что он работает в основном потоке.   -  person Mathieu    schedule 18.11.2011


Ответы (1)


Из здесь:

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

Таким образом, NSOperationQueue всегда выполняется в отдельном потоке.

person d.lebedev    schedule 17.11.2011
comment
Да, я это знаю, и поэтому я не понимаю, почему он не работает в отдельном потоке на устройстве с ios 4.2.1. Я добавил этот фрагмент кода в свою nsoperation, и я вижу сообщение журнала на ios4, а не на ios5 if ([NSThread isMainThread]) { NSLOG(@isMainThread); } Также mainThread полностью заблокирован на ios4 из-за обработки изображений, а не на ios5.... - person Mathieu; 17.11.2011
comment
Это неверно - или, по крайней мере, когда вы опубликовали это, документация была устаревшей. В iOS 4 и более поздних версиях очереди операций используют Grand Central Dispatch для выполнения операций. До iOS 4 они создавали отдельные потоки для непараллельных операций и запускали параллельные операции из текущего потока. - person bandejapaisa; 24.04.2013