我想在ios中加载viewDidLoad之前获取数组值
我想在应用程序启动时获取特定相册中的所有图像,因此我通常通过我想在ios中加载viewDidLoad之前获取数组值,ios,objective-c,alassetslibrary,Ios,Objective C,Alassetslibrary,我想在应用程序启动时获取特定相册中的所有图像,因此我通常通过枚举组swithtypes获取图像。 我将代码放在AppDelegate中,但我在查看时只显示了,但我需要viewDidLoad中的值。下面是我的代码 //in AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { ALAssetsLi
枚举组swithtypes
获取图像。
我将代码放在AppDelegate
中,但我在查看时只显示了,但我需要viewDidLoad
中的值。下面是我的代码
//in AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
ALAssetsLibraryAccessFailureBlock failureBlock = ^(NSError *error) {
UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"ERROR" message:[NSString stringWithFormat:@"No Albums Available"] delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil];
[alert show];
};
// ALAssetsLibraryGroupsEnumerationResultsBlock listGroupBlock
void (^assetGroupEnumerator)( ALAssetsGroup *, BOOL *)= ^(ALAssetsGroup *group, BOOL *stop) {
NSLog(@"Block123");
if (group == nil)
{
return;
}
if ([[group valueForProperty:ALAssetsGroupPropertyName] isEqualToString:@"FlipDemo"]) {
[self.groups addObject:group];
NSLog(@" arr 123 %@",self.groups);
return ;
}
if (stop) {
return;
}
};
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
NSLog(@"Block Out");
[self.assetLibrary enumerateGroupsWithTypes:ALAssetsGroupAll
usingBlock: assetGroupEnumerator
failureBlock:failureBlock];
});
}
- (void)viewDidLoad {
[super viewDidLoad];
appdelegate=(AppDelegate *)[UIApplication sharedApplication].delegate;
self.groups=appdelegate.groups;
NSLog(@"// ,%@",self.groups);//Null Value
}
-(void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:YES];
self.groups=appdelegate.groups;
NSLog(@"// ,%@",self.groups);//Get the url from the asset
NSLog(@"did appear");
}
数据在viewDidLoad和ViewDidDisplay之间变得可用只是巧合。您正在执行一个异步调用,您不知道它何时调用assetGroupEnumerator块。因此,也可能存在数据在ViewDidDisplay中不可用的情况。
所以你应该重新思考你的架构。一种方法是异步获取viewDidLoad中的数据,并在等待数据时向用户显示一些消息或加载指示。数据加载完成后,将其显示。您正在异步更新组。因此,您不应该期望它通过
viewDidLoad
(也不希望viewDidAppear
)可用
您应该采用异步模式。要么:
viewDidLoad
添加groups
属性的观察者(但在检索到所有组之前不要更新该属性)组时发布通知,并让viewDidLoad
将自身添加为该通知的观察者
viewDidLoad
启动枚举本身,然后它将知道枚举何时完成。具体来说,当枚举方法的group
参数为nil
时,您就知道它完成了。如果您在viewDidLoad
中执行此操作,则可以在该点触发您想要的任何UI更新(例如,重新加载表或集合视图等)无论哪种方式,都不要期望异步方法在应用程序启动过程中的任何给定点完成。也不要试图让它同步运行。采用异步模式。如果您想在
viewDidLoad
中使用它,为什么要异步使用它?是的。我想在viewDidLoad中使用。我在appdelegate中使用异步。在异步调度之前设置一个信号量,并从异步块的最后一行发出信号。等待viewDidLoad
@dasblinkenlight-Yikes中的信号灯!不,永远不要阻塞主线程。@Rob我同意不应该阻塞主线程。但是设计需要更改为不需要viewDidLoad
中的数据。