2013-05-15 3 views
1

Я использую 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]; 
      }]; 
     }]; 
    }]; 
} 

Ошибка соединения не происходит, когда пользователь нажимает домашний ключ. Он выходит из строя только при закрытой крышке магнитной крышки или при тайм-ауте.

ответ

2

Когда приложение перемещено на фон, ОС дает приложению 5s закончить то, что он делает до его приостановки (сохраняет ОЗУ, но останавливает приложение, получая какие-либо сообщения или ничего не делая). Если у вас есть задача, которая должна выполняться до завершения, когда пользователь нажимает кнопку «домой», вы можете использовать фоновое задание. Из документации Apple:

вашего приложения делегат applicationDidEnterBackground: метод имеет примерно 5 секунд, чтобы закончить любые задачи и возвращение. На практике этот метод должен возвращаться как можно быстрее. Если метод не возвращается до истечения времени, ваше приложение будет убито и очищено от . Если вам по-прежнему требуется больше времени для выполнения задач, вызовите метод beginBackgroundTaskWithExpirationHandler: для запроса фона времени выполнения, а затем запустите любые длительные задачи во вторичном потоке . Независимо от того, запускаете ли вы какие-либо фоновые задачи, метод applicationDidEnterBackground: должен все же выйти в течение 5 секунд.

Примечание: Уведомление UIApplicationDidEnterBackgroundNotification - также отправлено, чтобы заинтересованные части вашего приложения знали, что он вводит фон . Объекты вашего приложения могут использовать уведомление по умолчанию для регистрации этого уведомления.

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

1

USE достижимости код Попробуйте этот код для сохранения данных после загрузки:

-(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]; 
}