我使用CMIS(Content management interoperability services)
从alfresco服务器下载数据。我正在使用以下代码,它在某种程度上工作得很好,但是当应用程序进入后台时,网络连接丢失,当应用程序进入前台时,它试图重试下载并失败说连接错误。因为我是新手,任何帮助都将不胜感激。
- (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键时连接不失败。仅当磁盖盖关闭或超时时失效
当一个应用程序被移到后台时,操作系统给应用程序5秒的时间来完成它正在做的事情,然后它被挂起(保留RAM,但停止应用程序接收任何消息或做任何事情)。如果您有一个任务需要在用户按下home键时运行到完成,您可以使用后台任务。来自apple的文档:
从http://developer.apple.com/library/ios/你的应用程序委托的applicationDidEnterBackground:方法有大约5秒完成任何任务并返回。在实践中,这个方法应该尽快返回。如果方法做了在时间耗尽之前没有返回,你的应用程序将被杀死并清除内存。如果你仍然需要更多的时间来完成任务,调用beginBackgroundTaskWithExpirationHandler:请求后台的方法执行时间,然后在辅助服务器中启动任何长时间运行的任务线程。无论您是否启动任何后台任务applicationDidEnterBackground:方法必须在5分钟内退出秒。
注意:UIApplicationDidEnterBackgroundNotification通知是也会让你的应用感兴趣的部分知道它正在进入背景。应用中的对象可以使用默认通知中心注册此通知。
文档/iphone/概念/iphoneosprogrammingguide/ManagingYourApplicationsFlow ManagingYourApplicationsFlow.html
使用可达性代码下载后尝试保存数据:
-(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];
}