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:方法。 在我调用它之前,我实际上是在一个单独的线程中但是在它通过之后切换到主线程...
答案 0 :(得分:1)
来自here:
在iOS中,操作队列不使用Grand Central Dispatch执行 操作。 为非并发操作创建单独的线程 并从当前线程启动并发操作。为一个 讨论并发和非并发的区别 操作及其执行方式,请参阅NSOperation类参考。
因此,NSOperationQueue总是在单独的线程上执行