[英]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.