У меня проблемы со следующим кодом, который загружает SKTexture, вызывая его size. Код случайным образом дает сбой примерно в 1 из каждых 100 запусков в строке, где вызывается размер. Есть и другие методы SKTexture для предварительной загрузки изображений, но они также вызывают сбой еще чаще! Я использую TextureAtlases, и для предотвращения сбоя все мои загрузки SKTexure происходят с помощью этого метода.
/* add image to dictionary thread-safe */
-(SKTexture*) getThreadSafeDictionaryContainImageOtherwiseLoadAndReturn:(NSString*) imageToLoad andForceLoad:(BOOL) forceLoad{
// to control the enviroment where the image dictionary is modified, go ahead and lock it down with an NSLock
[self.dictionaryModificationLock lock];
SKTexture *toReturn = nil;
CGSize size = CGSizeZero;
// first, ignore duplicate loads by looking for the image in an NSDictionary called "allImages"
if ((toReturn = [self.allImages objectForKey:imageToLoad])){
// have the image to return already loaded
}else{
// grab the SKTexture and force it to load by requesting it's size
SKTexture *texture = [SKTexture textureWithImageNamed:imageToLoad];
if (forceLoad)
size = texture.size; // crashes here!
[self.allImages setObject:texture forKey:imageToLoad];
toReturn = texture;
}
[self.dictionaryModificationLock unlock]; // unlock the NSLock
return toReturn;
}
Вот как выглядит отчет о сбое:
Fatal Exception: NSGenericException
*** Collection <NSConcreteMapTable: 0x1c059ff0> was mutated while being enumerated.
0 CoreFoundation __exceptionPreprocess + 126
2 CoreFoundation -[NSException name]
3 Foundation -[NSConcreteMapTable countByEnumeratingWithState:objects:count:] + 56
4 CoreFoundation -[__NSFastEnumerationEnumerator nextObject] + 110
5 SpriteKit +[SKTextureAtlas(Internal) findTextureNamed:] + 284
6 SpriteKit __26-[SKTexture loadImageData]_block_invoke + 1654
7 SpriteKit SKSpinLockSync(int*, void () block_pointer) + 104
8 SpriteKit -[SKTexture loadImageData] + 302
9 SpriteKit -[SKTexture size] + 42
Я нашел несколько других тем, говорящих, что это проблема со SpriteKit. Но я думаю, что должна быть какая-то работа вокруг. Что вы думаете, ребята?
Спасибо,
Гаррен