2013-05-15 102 views
1

我正在使用CMIS(Content management interoperability services)从户外服务器下载数据。我正在使用下面的代码,它在一定程度上工作正常,但是当应用程序转到后台时,网络连接会丢失,并且当应用程序到达前台时,它会尝试重试下载并且无法通知连接错误。由于我是新手,任何帮助将不胜感激。当应用程序转到后台时网络连接丢失

- (void)testFileDownload 
{ 
    [self runTest:^ 
    { 
     [self.session retrieveObjectByPath:@"/ios-test" completionBlock:^(CMISObject *object, NSError *error) { 
      CMISFolder *testFolder = (CMISFolder *)object; 
      STAssertNil(error, @"Error while retrieving folder: %@", [error description]); 
      STAssertNotNil(testFolder, @"folder object should not be nil"); 

      CMISOperationContext *operationContext = [CMISOperationContext defaultOperationContext]; 
      operationContext.maxItemsPerPage = 100; 
      [testFolder retrieveChildrenWithOperationContext:operationContext completionBlock:^(CMISPagedResult *childrenResult, NSError *error) { 
       STAssertNil(error, @"Got error while retrieving children: %@", [error description]); 
       STAssertNotNil(childrenResult, @"childrenCollection should not be nil"); 

       NSArray *children = childrenResult.resultArray; 
       STAssertNotNil(children, @"children should not be nil"); 
       STAssertTrue([children count] >= 3, @"There should be at least 3 children"); 

       CMISDocument *randomDoc = nil; 
       for (CMISObject *object in children) 
       { 
        if ([object class] == [CMISDocument class]) 
        { 
         randomDoc = (CMISDocument *)object; 
        } 
       } 

       STAssertNotNil(randomDoc, @"Can only continue test if test folder contains at least one document"); 
       NSLog(@"Fetching content stream for document %@", randomDoc.name); 

       // Writing content of CMIS document to local file 
       NSString *filePath = [NSString stringWithFormat:@"%@/testfile", NSTemporaryDirectory()]; 
       //    NSString *filePath = @"testfile"; 
       [randomDoc downloadContentToFile:filePath 
            completionBlock:^(NSError *error) { 
             if (error == nil) { 
              // Assert File exists and check file length 
              STAssertTrue([[NSFileManager defaultManager] fileExistsAtPath:filePath], @"File does not exist"); 
              NSError *fileError = nil; 
              NSDictionary *fileAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:&fileError]; 
              STAssertNil(fileError, @"Could not verify attributes of file %@: %@", filePath, [fileError description]); 
              STAssertTrue([fileAttributes fileSize] > 10, @"Expected a file of at least 10 bytes, but found one of %d bytes", [fileAttributes fileSize]); 

              // Nice boys clean up after themselves 
              [[NSFileManager defaultManager] removeItemAtPath:filePath error:&fileError]; 
              STAssertNil(fileError, @"Could not remove file %@: %@", filePath, [fileError description]); 
             } else { 
              STAssertNil(error, @"Error while writing content: %@", [error description]); 
             } 
             self.testCompleted = YES; 
            } progressBlock:nil]; 
      }]; 
     }]; 
    }]; 
} 

当用户按下home键时,连接失败不会发生。它只有在磁盖盖关闭或超时时才会失效。

回答

2

当应用程序移到后台时,操作系统会让应用程序5s完成暂停前的操作(保持RAM,但停止应用程序接收任何消息或执行任何操作)。如果您有一项任务需要在用户按下主页按钮时运行完成,则可以使用后台任务。从苹果公司的文档:

应用程序委托的applicationDidEnterBackground:方法有 约5秒完成任何任务并返回。在实践中, 这个方法应该尽快返回。如果方法确实 在时间耗尽之前没有返回,则会终止您的应用并从内存中清除 内存。如果您仍然需要更多时间来执行任务,请致电 beginBackgroundTaskWithExpirationHandler:方法请求后台 执行时间,然后在第 线程中启动任何长时间运行的任务。无论您是否启动任何后台任务, applicationDidEnterBackground:方法仍必须在5秒钟内退出。

注意:UIApplicationDidEnterBackgroundNotification通知是 也发送到让您的应用程序的感兴趣的部分知道它是输入 的背景。您的应用中的对象可以使用默认通知 中心注册此通知。

http://developer.apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html

1

使用可达代码试试这个代码,以节省下载一次数据:

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{ 
//try to access that local file for writing to it... 
NSFileHandle *hFile = [NSFileHandle fileHandleForWritingAtPath:self.localPath]; 
//did we succeed in opening the existing file? 
if (!hFile) 
{ //nope->create that file! 
    [[NSFileManager defaultManager] createFileAtPath:self.localPath contents:nil attributes:nil]; 
    //try to open it again... 
    hFile = [NSFileHandle fileHandleForWritingAtPath:self.localPath]; 
} 
//did we finally get an accessable file? 
if (!hFile) 
{ //nope->bomb out! 
    NSLog("could not write to file %@", self.localPath); 
    return; 
} 
//we never know - hence we better catch possible exceptions! 
@try 
{ 
    //seek to the end of the file 
    [hFile seekToEndOfFile]; 
    //finally write our data to it 
    [hFile writeData:data]; 
} 
@catch (NSException * e) 
{ 
    NSLog("exception when writing to file %@", self.localPath); 
    result = NO; 
} 
[hFile closeFile]; 
} 
相关问题