我想在ios中的viewDidLoad之前获取数组值

时间:2015-02-16 13:58:35

标签: ios objective-c alassetslibrary

我希望在推出应用时获取特定相册中的所有图片,因此我过去常常通过enumerateGroupsWithTypes获取图片。 我将代码放在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");

}

2 个答案:

答案 0 :(得分:2)

您正在异步更新groups。因此,您不应期望viewDidLoad(也不是viewDidAppear就可以使用它。

您应该使用异步模式。之一:

  1. 例如,让viewDidLoad添加groups属性的观察者(但在检索完所有组之前不要更新该属性)。

  2. 或者,当完成groups的更新时,让完成块发布通知,并让viewDidLoad将自己添加为该通知的观察者。

    < / LI>
  3. viewDidLoad启动枚举本身,然后它将知道枚举何时完成。具体来说,当枚举方法的group参数为nil时,您就知道它已完成。如果您在viewDidLoad中执行此操作,则可以触发此时所需的任何UI更新(例如重新加载表或集合视图等)。

  4. 就个人而言,我倾向于第三种选择,因为它可能是最干净的(并避免与其他方法相关的时间烦恼)。

    无论哪种方式,都不要指望在应用程序启动过程中的任何给定点都可以完成异步方法。并且不要试图让它同步行为。采用异步模式。

答案 1 :(得分:0)

在viewDidLoad和viewDidAppear之间可以获得数据,这恰巧巧合。您正在进行异步调用,您不知道它何时调用assetGroupEnumerator块。因此,在viewDidAppear中甚至可能存在数据甚至不可用的情况 所以你应该重新思考你的架构。一种方法是异步获取viewDidLoad中的数据,同时等待数据向用户显示一些消息或加载指示。当数据加载完毕后,显示它。