2011-11-17 70 views
1

是否有任何理由为什么NSOperationQueue在ios 4.2.1上的主线程上执行,并在ios 5.0.1上运行在单独的线程上(如预期的那样)。NSOperationQueue在ios4上的主线程上执行,而不是在io5上执行?

我使用一个NSOperationQueue到perfom上推出我的应用程序的数量较大的图片(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:方法。 之前,我把它叫做我其实是在一个单独的线程,但它会突破它切换到主线程后...

+0

你猜错了。请将代码发布到创建队列的位置并将操作添加到该代码中。 – JeremyP

+0

确定这里是一些代码。基本上loadCurrentCameraRoll扫描cameraRoll并将缩略图保存在本地目录中 – Mathieu

+0

你是否忽略了-isConcurrent? – hooleyhoop

回答

1

here

在iOS系统中,操作队列不使用中央大调度执行 操作。 他们为非并发操作创建单独的线程 并从当前线程启动并发操作。有关并发和非并发 操作与它们如何执行之间差异的 讨论,请参见NSOperation类参考。

所以,NSOperationQueue始终执行一个单独的线程

+0

是的我知道这一点,这就是为什么我不明白为什么它没有在设备上的单独线程上运行,而是使用ios 4.2.1。我在nsoperation中添加了这段代码,并且如果([NSThread为MainThread]),我可以在ios4上看到日志消息,而不是在ios5上看到日志消息 NSLOG(@“isMainThread”); } 此外,主线程已全部锁定在ios4由于图像处理,而不是在ios5 .... – Mathieu

+1

这是不正确的 - 或者至少当你发布它时,文档已过时。在iOS 4及更高版本中,操作队列使用Grand Central Dispatch执行操作。在iOS 4之前,他们为非并发操作创建单独的线程,并从当前线程启动并发操作。 – bandejapaisa

相关问题