NSArray 乱序
NSArray out of Order
我的 NSArray 为 6,CMTimes 看起来像这样:
(
"CMTime: {0/600 = 0.000}",
"CMTime: {600/600 = 1.000}",
"CMTime: {1200/600 = 2.000}",
"CMTime: {1800/600 = 3.000}",
"CMTime: {2400/600 = 4.000}",
"CMTime: {3000/600 = 5.000}",
"CMTime: {3600/600 = 6.000}"
)
然后在一个方法中我有
NSValue *myTime = [times objectAtIndex:i];
NSArray *array = [[NSArray alloc] initWithObjects:myTime, nil];
//Also all these get logged before anything inside block is logged, when I
//looping the whole thing
NSLog(@"%@", array);
[imageGenerator generateCGImagesAsynchronouslyForTimes:array completionHandler:^(CMTime requestedTime, CGImageRef image, CMTime actualTime, AVAssetImageGeneratorResult result, NSError *error) {
//HERE its not in order
NSString *requestedTimeString = (NSString *) CFBridgingRelease(CMTimeCopyDescription(NULL, requestedTime));
NSString *actualTimeString = (NSString *) CFBridgingRelease(CMTimeCopyDescription(NULL, actualTime));
NSLog(@"Requested: %@; actual %@", requestedTimeString, actualTimeString);
其中 i 是一个 NSInteger 并且随着循环增加。然后在下一行中,我将这个包含一个值的数组传递给 imageGenerator generateCGImagesAsynchronouslyForTimes
但是,当我在 generateCGImagesAsynchronouslyForTimes
方法中执行此操作时,时间是乱序的,即使在我记录它们之前有一行他们是有序的?
这是怎么回事,我该如何解决?
感谢您的帮助。
编辑
看起来您正在制作单独的一个条目数组,然后将它们传递给异步方法。我相信 generateCGImagesAsynchronouslyForTimes:handler 方法的目的是批处理操作(你可能正在为此做这项工作?)。现在事情可以以任何顺序返回(或者可能在单独的线程上使问题复杂化)。
尝试一次传递整个数组(次)。
或者,完成处理程序为您提供足够的信息以将图像按排序顺序插入到不同的集合中。
回复您的评论:
NSMutableArray *completedList = [NSMutableArray array];
__block count = [array count];
[imageGenerator generateCGImagesAsynchronouslyForTimes:array completionHandler:^(CMTime requestedTime, CGImageRef image, CMTime actualTime, AVAssetImageGeneratorResult result, NSError *error) {
// Check the time here, insert the items to the array in order using something like
[completedList insertObject: image atIndex: indexThatItShouldGoInOrder];
// Or adding them all and sorting them at the end, whichever is easier
count--; // Wait till you have them all
if(!count) {
// Here trigger the other stuff you were going to do because it's done.
}
}];
如果处理程序在多个线程上 运行,这可能需要稍微复杂一些。您将需要使用 GCD 来保护 array/sort/insert。您还需要确保计数--,检查计数是原子的。
根据您要执行的操作,在 if(!count) 块中执行 dispatch_async() 也可能有意义。
我的 NSArray 为 6,CMTimes 看起来像这样:
(
"CMTime: {0/600 = 0.000}",
"CMTime: {600/600 = 1.000}",
"CMTime: {1200/600 = 2.000}",
"CMTime: {1800/600 = 3.000}",
"CMTime: {2400/600 = 4.000}",
"CMTime: {3000/600 = 5.000}",
"CMTime: {3600/600 = 6.000}"
)
然后在一个方法中我有
NSValue *myTime = [times objectAtIndex:i];
NSArray *array = [[NSArray alloc] initWithObjects:myTime, nil];
//Also all these get logged before anything inside block is logged, when I
//looping the whole thing
NSLog(@"%@", array);
[imageGenerator generateCGImagesAsynchronouslyForTimes:array completionHandler:^(CMTime requestedTime, CGImageRef image, CMTime actualTime, AVAssetImageGeneratorResult result, NSError *error) {
//HERE its not in order
NSString *requestedTimeString = (NSString *) CFBridgingRelease(CMTimeCopyDescription(NULL, requestedTime));
NSString *actualTimeString = (NSString *) CFBridgingRelease(CMTimeCopyDescription(NULL, actualTime));
NSLog(@"Requested: %@; actual %@", requestedTimeString, actualTimeString);
其中 i 是一个 NSInteger 并且随着循环增加。然后在下一行中,我将这个包含一个值的数组传递给 imageGenerator generateCGImagesAsynchronouslyForTimes
但是,当我在 generateCGImagesAsynchronouslyForTimes
方法中执行此操作时,时间是乱序的,即使在我记录它们之前有一行他们是有序的?
这是怎么回事,我该如何解决?
感谢您的帮助。
编辑
看起来您正在制作单独的一个条目数组,然后将它们传递给异步方法。我相信 generateCGImagesAsynchronouslyForTimes:handler 方法的目的是批处理操作(你可能正在为此做这项工作?)。现在事情可以以任何顺序返回(或者可能在单独的线程上使问题复杂化)。
尝试一次传递整个数组(次)。
或者,完成处理程序为您提供足够的信息以将图像按排序顺序插入到不同的集合中。
回复您的评论:
NSMutableArray *completedList = [NSMutableArray array];
__block count = [array count];
[imageGenerator generateCGImagesAsynchronouslyForTimes:array completionHandler:^(CMTime requestedTime, CGImageRef image, CMTime actualTime, AVAssetImageGeneratorResult result, NSError *error) {
// Check the time here, insert the items to the array in order using something like
[completedList insertObject: image atIndex: indexThatItShouldGoInOrder];
// Or adding them all and sorting them at the end, whichever is easier
count--; // Wait till you have them all
if(!count) {
// Here trigger the other stuff you were going to do because it's done.
}
}];
如果处理程序在多个线程上 运行,这可能需要稍微复杂一些。您将需要使用 GCD 来保护 array/sort/insert。您还需要确保计数--,检查计数是原子的。
根据您要执行的操作,在 if(!count) 块中执行 dispatch_async() 也可能有意义。