我想在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
    中的数据。