使用 ASIHTTPRequest 下载 plist 只能部分工作

Posted

技术标签:

【中文标题】使用 ASIHTTPRequest 下载 plist 只能部分工作【英文标题】:Downloading plist with ASIHTTPRequest works only partially 【发布时间】:2012-05-28 22:57:08 【问题描述】:

我有一个游戏可以玩不同的类别。这些类别基本上是 plist 文件。因此,如果将来我想添加 plist,用户应该能够下载 plist 并玩新的关卡。所以我的目标是:

从 URL 下载 .plist 将 .plist 文件保存在 iphone 上的文档目录中(永久) 使用 .plist

这是我所做的并且它有效(控制台日志“完成!”),但如果我检查文件是否在文档目录中,则没有响应(布尔文件存在保持否)。

-(void)startGame:(id)sender
    NSArray *categoriesArray = [[GameStateSingleton sharedMySingleton] categoriesArray];
    NSString *category = [NSString stringWithFormat:[categoriesArray objectAtIndex:[sender tag]]];


    NSString *thePath = [mainPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.plist",category]];
    NSDictionary *categoryPlist = [NSDictionary dictionaryWithContentsOfFile:thePath];

    if(categoryPlist != nil)
        [[GameStateSingleton sharedMySingleton]setCurrentCategory:category];
        [[GameStateSingleton sharedMySingleton]updateHexCountAndInitalTime];
        [[CCDirector sharedDirector]replaceScene:[CCTransitionFade transitionWithDuration:TRANSITIONDURATION scene:[LevelSets scene]]]; 
    
    else

        [self plistForCategory:category];
        NSString* documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
        NSString *myCategory= [documentsPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.plist",category]];
        BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:myCategory];
        if(fileExists == YES)
            [[GameStateSingleton sharedMySingleton]setCurrentCategory:category];
            [[GameStateSingleton sharedMySingleton]updateHexCountAndInitalTime];
            [[CCDirector sharedDirector]replaceScene:[CCTransitionFade transitionWithDuration:TRANSITIONDURATION scene:[LevelSets scene]]]; 
            NSLog(@"category exists now");
        
    






-(void)plistForCategory:(NSString*)category


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

    NSURL *url = [NSURL URLWithString:[ NSString stringWithFormat:@"http://www.tinycles.com/wannaplay/plists/%@.plist",category]];

    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    [request setDownloadDestinationPath:documentsDirectory];
    [request setDelegate:self];
    [request startAsynchronous];





- (void)requestFinished:(ASIHTTPRequest *)request 

    NSLog(@"finished !!");


- (void)requestFailed:(ASIHTTPRequest *)request

    // Download failed. This is why.
    NSError *error = [request error];
    NSLog(@"%@", error);

【问题讨论】:

【参考方案1】:

也许问题是因为您正在启动异步请求,所以如果请求尚未完成,您的 if(fileExist==YES) 仍然返回 NO;我建议您在这种情况下启动同步请求:

- (IBAction)startRequest:(id)sender

  NSURL *url = [NSURL URLWithString:LINK_TO_PLIST];
  ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
  [request setDownloadDestinationPath:DOC_PATH];
  [request startSynchronous];
  NSError *error = [request error];
  if (!error) 
      //start your game after the file is downloaded
  

【讨论】:

不幸的是,没有任何变化...... :( 我已经更新了我的答案,可能if总是返回no,因为文件还没有被下载,你尝试过使用同步请求吗? 是的,我已经尝试过了...下载这个文件需要多长时间?因为老实说,我不知道问题可能出在哪里...... 通常同步请求用于小文件,这会阻塞主线程。否则,如果您想使用异步请求以免阻塞主线程,则应在完全下载关卡文件之前启动游戏。

以上是关于使用 ASIHTTPRequest 下载 plist 只能部分工作的主要内容,如果未能解决你的问题,请参考以下文章

使用ASIHTTPRequest下载音频

ASIHTTPRequest 下载缓存问题 - 无法在缓存中保存/加载日期

ASIHttpRequest - 移动到实时 PHP 服务器后不创建临时文件

ASIHttpRequest-移动到实时PHP服务器后未创建临时文件

ASIHTTPRequest实现断点下载

ASIHTTPRequest类库简介和使用说明