NSOperationQueue是在ios4上的主线程上执行而不是在io5上执行?

时间:2011-11-17 14:42:04

标签: objective-c ios multithreading nsoperationqueue

NOSperationQueue是否有理由在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:方法。 在我调用它之前,我实际上是在一个单独的线程中但是在它通过之后切换到主线程...

1 个答案:

答案 0 :(得分:1)

来自here

  

在iOS中,操作队列不使用Grand Central Dispatch执行   操作。 为非并发操作创建单独的线程   并从当前线程启动并发操作。为一个   讨论并发和非并发的区别   操作及其执行方式,请参阅NSOperation类参考。

因此,NSOperationQueue总是在单独的线程上执行