Есть ли причина, по которой 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:. Прежде чем я назову это, я на самом деле в отдельном потоке, но после того, как он пройдет, он переключится на основной поток...
[NSThread isMainThread]
в свой методmain
, просто чтобы убедиться, что он работает в основном потоке. Возможно ли, что вторичный поток запускается, но выполняет синхронные задачи в основном потоке (например, обновления пользовательского интерфейса). - person JeremyP   schedule 18.11.2011