繁体   English   中英

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

[英]NSOperationQueue is performing on the main thread on ios4 and not on 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:方法。 在我称之为它之前,我实际上是在一个单独的线程中,但是经过它之后,它将切换到主线程...

这里

在iOS中,操作队列不使用Grand Central Dispatch执行操作。 它们为非并发操作创建单独的线程 ,并从当前线程启动并发操作。 有关并行操作和非并行操作之间的区别以及如何执行的讨论,请参见《 NSOperation类参考》。

因此,NSOperationQueue始终在单独的线程上执行

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM