是否有任何理由为什么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:方法。 之前,我把它叫做我其实是在一个单独的线程,但它会突破它切换到主线程后...
你猜错了。请将代码发布到创建队列的位置并将操作添加到该代码中。 – JeremyP
确定这里是一些代码。基本上loadCurrentCameraRoll扫描cameraRoll并将缩略图保存在本地目录中 – Mathieu
你是否忽略了-isConcurrent? – hooleyhoop