У меня есть цикл вложенных циклов, в котором я много раз вызываю метод getSnapShotData
и записываю эти данные на диск. Я заметил, что я слишком много наращиваю память, делая это, и у меня заканчивается память, поэтому я подумал, что это будет хороший вариант использования dispatch semaphore
.Запретить цикл от цикла до тех пор, пока внутренний цикл не будет записываться на диск
У меня все еще не хватает памяти, поэтому я не уверен, правильно ли использую семафор. По сути, я хочу, чтобы следующий цикл ожидал, пока данные предыдущего цикла не будут записаны на диск, поскольку я думаю, что это освободит память. Но я могу ошибаться. Спасибо за помощь.
Код:
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
for (NSDictionary *sub in self.array)
{
NSArray *lastArray = [sub objectForKey:@"LastArray"];
for (NSDictionary *dict in lastArray)
{
currentIndex ++;
NSData *frame = [NSData dataWithData:[self getSnapshotData]];
savePath = [NSString stringWithFormat:@"%@/%lu.png",frameSourcePath,(unsigned long)currentIndex];
BOOL nextLoop = [frame writeToFile:savePath options:0 error:nil];
frame = nil;
if (nextLoop)
{
dispatch_semaphore_signal(sema);
}
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
}
}
- (NSData *)getSnapshotData
{
UIGraphicsBeginImageContextWithOptions(self.containerView.bounds.size, NO, 0.0);
[self.containerView.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *snapShot = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return [NSData dataWithData:UIImagePNGRepresentation(snapShot)];
}
BTW - использование семафора ничего не изменило для вашего кода и управления памятью. – rmaddy