iOS:如何在显示之前预加载数据

时间:2012-11-09 12:01:44

标签: iphone objective-c asynchronous preload appdelegate

在我正在制作的IPhone应用中,我有initialViewController

(1)带按钮。单击按钮后,它将转移到另一个视图控制器

(2),此时加载来自CoreData文件的数据并将其显示给用户。

我的问题是加载(2)和实际数据显示之间有一个小的延迟。这当然是因为数据需要花费一点时间才能加载。我正在做asynchronously,我的目标是永远不会显示旋转轮或加载屏幕(更加用户友好)。

我想做的是“preload”(1)处的数据,而不是(2),数据应该已经由时间(2)加载加载,应该立即显示。 我知道如何在(1)加载数据,但我不知道如何轻松地将其传递给(2)。我不能用segue做这件事,因为我的app实际上比上面的描述复杂一点,而且通过segue做这件事很麻烦。

我听说可以使用“AppDelegate”,但由于我是编程新手,所以我不知道如何有效地使用它。我一直关注的在线课程没有给出如何使用它的非常明确的见解,所以我有点迷失。

有什么想法吗?

提前谢谢!

4 个答案:

答案 0 :(得分:1)

看到你对Paras的帖子发表评论后,我有一个更好的解决方案:

创建一个名为fileLoader

的NSObject子类
//in fileLoader.h
@interface fileLoader : NSObject {
}
+(fileLoader *)sharedInstance;
+(void)createSharedInstance;
//add functions and variables to load, store data for use in another class
@end

然后,

//in fileLoader.m
@implementation fileLoader
static id _instance;


+(void)createSharedInstance{
    _instance = [[fileManager alloc] init];
}
+(fileManager *)sharedInstance{
    return _instance;
}
//other functions for storing, retrieving, loading, standard init function, etc.

@end 现在,您可以通过调用[fileManager createSharedInstance]上的函数来调用[fileManager sharedInstance]来实例化您可以在任何地方使用的文件管理器。

答案 1 :(得分:0)

属性使用NSMutableArray文件

中的数据合成yourNextViewController.h
@property(nonatomic, retain) NSMutableArray *nextViewArray;

并且在yourNextViewController.m文件中只有Synthesize,如bellow ..

@synthesize nextViewArray;

然后就像吼叫一样......

      yourNextViewController *objNextView = [[yourNextViewController alloc]initWithNibName:@"yourNextViewController" bundle:nil];
      objNextView.nextViewArray = [[NSMutableArray alloc]init];
      objNextView.nextViewArray = yourDataArray;
      [objNextView.nextViewArray retain];
      [self.navigationController pushViewController:objNextView animated:YES];
      [objNextView release];

你也可以传递字符串或字典而不是数组..

我希望这对你有所帮助

答案 2 :(得分:0)

您可以使用某种DataManager对象在加载数据后存储数据,以便在应用中的任何位置轻松检索。如果您只需在应用程序启动时加载数据即可。

诀窍是让它成为一个单例对象,所以无论你在应用程序的哪个位置引用它,它都会预先加载数据。我在我的项目中经常使用这些来管理我在应用程序中需要的所有数据。

那里有无数的例子

答案 3 :(得分:0)

AppDelegate更适合将数据从(2)传递到(1)。要将数据加载到(1)中的(2),您可以使用与加载(2)时相同的函数,因为(1)将(2)视为viewController的一个实例。就像这样:

//In OneViewController.m
-(void)viewDidLoad:(BOOL)animated{
    [super viewDidLoad:animated];

    TwoViewController *VCTwo = [[TwoViewController alloc] initWithNibName:@"TwoViewController" bundle:nil];
    //note that I am only instantiating VCTwo, I am not displaying it.
}

-(void)loadVCTwoFromVCOne{
    [TwoViewController preloadInformation];
    //simply call the function to load the data on the instance of the viewController before displaying it
}

-(IBAction)presentVCTwo{
    [self presentViewController:VCTwo animated:YES completion:nil];
    //when you are ready, you can display at any time
}