Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone iOS:如何在显示前预加载数据_Iphone_Objective C_Asynchronous_Preload_Appdelegate - Fatal编程技术网

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

Iphone iOS:如何在显示前预加载数据,iphone,objective-c,asynchronous,preload,appdelegate,Iphone,Objective C,Asynchronous,Preload,Appdelegate,在我正在制作的IPhone应用程序中,我有一个initialViewController (1) 用按钮。单击按钮后,它将转到另一个视图控制器 (2) ,此时将从CoreData文件加载数据并将其显示给用户 我的问题是,(2)的加载和数据的实际显示之间有一个小的延迟。这当然是因为加载数据需要一点时间。我是以异步方式做这件事的,我的目标是永远不显示旋转的轮子或加载屏幕(更方便用户) 我想做的是“预加载”(1)处的数据,而不是(2)处的数据,这样在(2)加载时数据应该已经加载,并且应该立即显示我知道

在我正在制作的
IPhone
应用程序中,我有一个
initialViewController

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

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

我的问题是,(2)的加载和数据的实际显示之间有一个小的延迟。这当然是因为加载数据需要一点时间。我是以异步方式做这件事的,我的目标是永远不显示旋转的轮子或加载屏幕(更方便用户)

我想做的是“
预加载
”(1)处的数据,而不是(2)处的数据,这样在(2)加载时数据应该已经加载,并且应该立即显示我知道如何在(1)处加载数据,但不知道如何轻松地将其传递到(2)。我不能使用segue,因为我的应用程序实际上比上面描述的要复杂一点,而且通过segue进行操作很麻烦

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

有什么想法吗


提前谢谢你

属性使用以下数据合成
NSMutableArray
。。在
yourNextViewController.h
文件中

@property(nonatomic, retain) NSMutableArray *nextViewArray;
您的nextviewcontroller.m
文件中,就像下面那样进行合成

@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];
也可以传递字符串或字典而不是数组


我希望这对您有所帮助

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

诀窍是使它成为一个单例对象,这样无论你在应用程序中的什么地方引用它,它都将是已经预加载数据的同一个实例。在我的项目中,我经常使用这些工具来管理我在应用程序中需要的所有数据


有无数的例子

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
}

在看到您在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
那么

@结束
现在您可以调用
[fileManager createSharedInstance]
来实例化一个文件管理器,通过调用
[fileManager sharedInstance]
上的函数,您可以在任何地方使用该文件管理器。我不认为显示加载屏幕或旋转轮对用户不友好。有时应用程序需要时间来做一些事情。与其让用户等待并盯着一个没有响应的屏幕,不如让他们知道你很忙,这样用户就知道后台正在发生什么事情。我同意。我打算有一个纺车以防万一,但我只是想尽可能减少用户的感知加载时间。嗨,谢谢你的回答。如果我理解正确的话,你是在传递数据。正如我所说,不幸的是,在我的例子中,这并不是那么容易,因为我不仅仅使用一个segue,而是多个segue,而且它通常非常混乱(我尝试过这样做,结果非常混乱,我没有得到我想要的东西)。因此,我正在寻找一种不必通过segue传递数据的方法。无论我在哪个视图控制器中,我都可以从中获取数据。@Konrad,这段代码对于将数据从一个视图传递到另一个视图非常有用,因此在这里,您只需从web下载一次数据并全局使用它。。但是解决你的问题没关系,这很好:)WolfLink的回答帮助我澄清了你自己的回答,我也更好地理解了你想说什么。谢谢你的帮助。这意味着我可以在加载之前“实例化”我的(2),然后再实际加载它?我不知道我能做到。我认为这应该很好,谢谢。是的,事实上我在我的一个应用程序中也做了类似的事情。这是一个游戏,对于加载关卡,我将levelname传递给游戏引擎,以便在显示之前进行准备;我遇到了很多问题,因为我无法找到从控制器轻松传递数据的方法。。。我以后会记住的。谢谢:)。这似乎正是我想要的(WolfLink的答案非常有用,只是没有那么灵活,我想以后可能会更有用)。谢谢你指出了单例的使用,我不知道。我在游戏中也使用了类似的东西,我有一个audiomanager类,我与它共享一个实例,这样我可以保留常用声音的缓存,还有其他好处。
//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.