第一次启动应用程序时如何只访问一次任何方法

Posted

技术标签:

【中文标题】第一次启动应用程序时如何只访问一次任何方法【英文标题】:how to access any method only once while launching the app for first time 【发布时间】:2013-05-08 20:56:51 【问题描述】:

我有一个 Web 服务来获取 JSON 表单中的数据。每次应用程序启动(在appDidFinishLaunching 方法内)并将其存储在本地文件中时,我都会调用此服务。我只想在应用程序第一次启动时调用该服务,并且从下一次我只想使用我存储了我的JSON 数据的文件。

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];

    //live json data url

    NSURL *url = [NSURL URLWithString:@"My Url"];
    NSData *urlData = [NSData dataWithContentsOfURL:url];

    //attempt to download live data
    if (urlData)
    
        NSString *filePath = [NSString stringWithFormat:@"%@/%@", documentsDirectory,@"data.json"];
        [urlData writeToFile:filePath atomically:YES];

    
    //copy data from initial package into the applications Documents folder
    else
    
        //file to write to
        NSString *filePath = [NSString stringWithFormat:@"%@/%@", documentsDirectory,@"data.json"];

        //file to copy from
        NSString *json = [ [NSBundle mainBundle] pathForResource:@"data" ofType:@"json" inDirectory:@"html/data" ];
        NSData *jsonData = [NSData dataWithContentsOfFile:json options:kNilOptions error:nil];

        //write file to device
        [jsonData writeToFile:filePath atomically:YES];
    

    NSError *jsonError = nil;

    NSString *jsonFilePath = [NSString stringWithFormat:@"%@/%@", documentsDirectory,@"data.json"];
    NSData *jsonData = [NSData dataWithContentsOfFile:jsonFilePath options:kNilOptions error:&jsonError ];
    NSMutableArray *jsonArray = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&jsonError];
    self.serverResponseArray = jsonArray;
    NSLog(@"%@",self.serverResponseArray);

通过这段代码,我正在编写 JSON 对本地文件的响应并将其存储在一个数组中以在整个应用程序中使用它。

【问题讨论】:

你可以在尝试加载数据之前测试文件的存在吗? 我该如何检查。 ? 第一次加载 json,并将其存储在具有特定名称的本地文件中(如果我理解得很好)。下次启动应用程序时,如果存在具有该名称的文件,则无需加载 json,只需使用该文件即可。但只是出于好奇,您不希望每次启动应用程序时都更新这些数据吗? 你的好奇心其实很好,但我需要这些数据,即使突然网络中断或建筑物地下室的网络很差。好吧,您能否告诉我们如何检查该文件名是否存在。我不知道如何检查文件的存在。任何链接都会有所帮助。 google上有很多资源在讲,比较简单,直接搜索objective-c write/read file即可。 【参考方案1】:
   static NSString * const someKey = @"haveChecked";
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification


    NSUserDefaults * stdUserDefaults = [NSUserDefaults standardUserDefaults];
    if(![[stdUserDefaults objectForKey:someKey] boolValue])
    
        [self trySomething];
    

-(void)gotJson

    //async callback
    NSUserDefaults * stdUserDefaults = [NSUserDefaults standardUserDefaults];
    [stdUserDefaults setBool:YES forKey:someKey];
    [stdUserDefaults synchronize];


听起来你需要学习处理文件,所以这里有一些堆栈溢出阅读:

What is the documents directory (NSDocumentDirectory)? Write a file on ios

【讨论】:

我认为这不会解决最初的问题,即仅在第一次启动时加载 JSON。这些都确保每次发布都会发生一些事情,一次。【参考方案2】:

试试这个

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    

            if ([self fetchFromNSUserDefaults:@"FirstTimeNO"]==nil || [FunctionManager fetchFromNSUserDefaults:@"FirstTimeNO"]==@"") 
                 [self YourFunctionThatCallFirstTime];
            
        return YES;
    

    -(id)fetchFromNSUserDefaults:(NSString *)strKey
             NSUserDefaults *objUserDefaults = [NSUserDefaults standardUserDefaults];
              return [objUserDefaults objectForKey:strKey];
    

    -(void)addToNSUserDefaults:(id)objValue forKey:(NSString *)strKey
        NSUserDefaults *objUserDefaults = [NSUserDefaults standardUserDefaults];
        [objUserDefaults setObject:objValue forKey:strKey];
        [objUserDefaults synchronize];
    

    -(void)YourFunctionThatCallFirstTime 
                 //Your Stuff

           [self addToNSUserDefaults:@"1" forKey:@"FirstTimeNO"];
     

【讨论】:

以上是关于第一次启动应用程序时如何只访问一次任何方法的主要内容,如果未能解决你的问题,请参考以下文章

访问时填充数据集表

如何像启动画面一样只运行一次活动

只下载一次数据,然后可以在整个应用程序中访问; NSUserDefaults 与单例

在java中如何保证程序模块只被执行一次

如何强制应用程序范围的 bean 在应用程序启动时实例化?

c#中让Windows窗体只运行一次,并在第二次启动窗体时激活该窗体