gpt4 book ai didi

ios - 程序流程出错

转载 作者:行者123 更新时间:2023-11-28 19:59:32 24 4
gpt4 key购买 nike

在这个代码片段中,程序的流程是 先跳出 for 循环,然后才进入 block 内
结果 block :^(ALAsset * Assets )。该代码首先在底部打印 NSLog,然后执行循环内的 block 。这里发生了什么?

 ALAssetsLibrary *lib=[ALAssetsLibrary new];
_sizeOfSelectedImage=0;
for (int i=0; i<assets.count; i++) {
ALAsset *asset=assets[i];
FileOP *fileMgr=[[FileOP alloc]init];
NSString *baseDir=[fileMgr GetDocumentDirectory];

//STORING FILE INTO LOCAL

[lib assetForURL:asset.defaultRepresentation.url
resultBlock:^(ALAsset *asset){
ALAssetRepresentation *repr = [asset defaultRepresentation];
CGImageRef cgImg = [repr fullResolutionImage];
NSString *fname = repr.filename;
UIImage *img = [UIImage imageWithCGImage:cgImg];
NSData *data = UIImagePNGRepresentation(img);
[data writeToFile:[baseDir stringByAppendingPathComponent:fname]
atomically:YES];
//FOR LOCAL URL OF THE IMAGE
//NSString *imageURL = [baseDir stringByAppendingPathComponent:fname];
//UIImage *myImg =[UIImage imageWithContentsOfFile:imageURL];
//NSLog(@"%@ URL OF IMAGE ",imageURL);
NSLog(@"Image %d has %d size",i,data.length);
_sizeOfSelectedImage +=data.length;
NSLog(@"%d is the size",_sizeOfSelectedImage);

}
failureBlock:^(NSError *error){

}];
}

NSLog(@"COPIED %lu FILE INTO LOCAL MEMORY AND TOTAL SIZE COPIED IS %d ",(unsigned long)assets.count,_sizeOfSelectedImage);

最佳答案

方法 assetForURL:resultBlock:failureBlock: 将异步执行 Assets 加载。这就是为什么我们首先执行底部的 NSLog,然后在 Block 中执行。如果你想让它同步执行,这样做:

   dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0) ^{
ALAssetsLibrary *lib=[ALAssetsLibrary new];
_sizeOfSelectedImage=0;

dispatch_group_t group = dispatch_group_create();

for (int i=0;i<assets.count;i++) {
ALAsset *asset=assets[i];
FileOP *fileMgr=[[FileOP alloc]init];
NSString *baseDir=[fileMgr GetDocumentDirectory];

//STORING FILE INTO LOCAL
dispatch_group_enter(group);
[lib assetForURL:asset.defaultRepresentation.url
resultBlock:^(ALAsset *asset){
ALAssetRepresentation *repr = [asset defaultRepresentation];
CGImageRef cgImg = [repr fullResolutionImage];
NSString *fname = repr.filename;
UIImage *img = [UIImage imageWithCGImage:cgImg];
NSData *data = UIImagePNGRepresentation(img);
[data writeToFile:[baseDir stringByAppendingPathComponent:fname]
atomically:YES];
//FOR LOCAL URL OF THE IMAGE
//NSString *imageURL = [baseDir stringByAppendingPathComponent:fname];
//UIImage *myImg =[UIImage imageWithContentsOfFile:imageURL];
//NSLog(@"%@ URL OF IMAGE ",imageURL);
NSLog(@"Image %d has %d size",i,data.length);
_sizeOfSelectedImage +=data.length;
NSLog(@"%d is the size",_sizeOfSelectedImage);
dispatch_group_leave(group);
}
failureBlock:^(NSError *error){
dispatch_group_leave(group);
}];
}
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
NSLog(@"COPIED %lu FILE INTO LOCAL MEMORY AND TOTAL SIZE COPIED IS %d ",(unsigned long)assets.count,_sizeOfSelectedImage);
dispatch_async(dispatch_get_main_queue(), ^{
// Do your call back on main thread here
});
});

Edit1:来自 Ken 的增强答案

ALAssetsLibrary *lib=[ALAssetsLibrary new];
_sizeOfSelectedImage=0;

dispatch_group_t group = dispatch_group_create();

for (int i=0;i<assets.count;i++) {
ALAsset *asset=assets[i];
FileOP *fileMgr=[[FileOP alloc]init];
NSString *baseDir=[fileMgr GetDocumentDirectory];

//STORING FILE INTO LOCAL
dispatch_group_enter(group);
[lib assetForURL:asset.defaultRepresentation.url
resultBlock:^(ALAsset *asset){
ALAssetRepresentation *repr = [asset defaultRepresentation];
CGImageRef cgImg = [repr fullResolutionImage];
NSString *fname = repr.filename;
UIImage *img = [UIImage imageWithCGImage:cgImg];
NSData *data = UIImagePNGRepresentation(img);
[data writeToFile:[baseDir stringByAppendingPathComponent:fname]
atomically:YES];
//FOR LOCAL URL OF THE IMAGE
//NSString *imageURL = [baseDir stringByAppendingPathComponent:fname];
//UIImage *myImg =[UIImage imageWithContentsOfFile:imageURL];
//NSLog(@"%@ URL OF IMAGE ",imageURL);
NSLog(@"Image %d has %d size",i,data.length);
_sizeOfSelectedImage +=data.length;
NSLog(@"%d is the size",_sizeOfSelectedImage);
dispatch_group_leave(group);
}
failureBlock:^(NSError *error){
dispatch_group_leave(group);
}];
}
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
// Do your call back on main thread here
NSLog(@"COPIED %lu FILE INTO LOCAL MEMORY AND TOTAL SIZE COPIED IS %d ",(unsigned long)assets.count,_sizeOfSelectedImage);

// Your code here
});

关于ios - 程序流程出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24857150/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com