2014-06-17 3 views
2

내 상용 인터넷 서버 (동시 연결을 허용하는)는 15-20 명의 사람들이 동시에 내 앱을 실행할 때 급격하게 압도적 인 것으로 보입니다. 이 앱은 많은 작업을 수행하기 위해 NSURLSession을 사용하지만 가장 먼저 수행해야 할 작업은 서버에서 비밀번호로 보호 된 부분으로 이동하여 사용자가 앱에서 더 진행할 수 있도록 비밀번호가 포함 된 간단한 텍스트 파일을 가져 오는 것입니다 .NSURLSession은 유지됩니까?

일단 암호 화면을 지나면이 응용 프로그램은 기본적으로 .pdf 뷰어로 기능하며 NSURLSession을 사용하여 사용자가 선택한 다양한 파일을 다운로드하고 표시합니다.

앱을 6 ~ 8 명의 사용자가 동시에 테스트하여 완벽하게 수행합니다. 더 많은 사용자가 동시에 앱을 실행하면 문제가 시작됩니다.

제 질문은 어떻게 NSURLSession이 연결되는지, 또는 더 중요한 것은 제 서버에서 "연결 해제"되는 것입니다.

내 앱은 탭 컨트롤러를 사용하여 볼 수있는 파일 목록을 제공하는 다양한보기 컨트롤러를 표시합니다. 이들 각각은 차례로 다른 View Controller를로드하여 선택한 파일을 표시합니다.

NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration]; 
    sessionConfig.allowsCellularAccess = YES; 
    sessionConfig.timeoutIntervalForRequest = 30; 
    sessionConfig.timeoutIntervalForResource = 60; 
    sessionConfig.HTTPMaximumConnectionsPerHost = 150; 
    sessionConfig.URLCache = NULL; 

    //Create the session with the newly created sessionConfig. 
    session = [NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:nil]; 

그때 선택한 파일을 풀다운하기 위해 downloadTask을 만들려면 새로 생성 된 세션을 사용 : 응용 프로그램의 각 뷰 컨트롤러가있는 viewDidLoad 메소드에서 다음 코드를 NSURLSession을 만듭니다. 각 세션이 앱 수명 동안 서버에 계속 연결되어있을 가능성이 있습니까?

ViewController는 모두 모달입니다. 따라서 새로운 ViewController가로드되고 다른 세션이 생성 될 때, ViewController가 닫힐 때 새로 만들어진 세션이 종료된다는 가정이있었습니다. 나는 더 이상 가정이 타당하다고 확신하지 않습니다.

NSURLSession의 단일 인스턴스 (앱 대리자 일 수도 있음)를 만든 다음 각보기 컨트롤러에서 해당 단일 인스턴스를 참조해야합니까? 그 것처럼 보이는 방법이지만 재 작성해야 할 뷰 컨트롤러가 많이 있으며 여기에서 먼저 물어보고 싶었습니다.

각 세션이 앱 실행을 위해 살아 있다면 나는 잠재적으로 앱의 단일 인스턴스와 100 개의 동시 세션을 생성하고 있다고 생각합니다 ... 최고입니다.

도움 주셔서 감사합니다.

+0

그리고 나는 방금 HTTPMaximumConnectionsPerHost 라인에 0을 손가락으로 가리킨 것을 깨달았습니다. 그건 15 살 이었어. 어쩌면 그게 범인 일 수도있어. – Scooter

+0

그래서 각 viewController에서 viewWillDisappear 메서드를 사용하여 [session invalidateAndCancel] 메서드를 실행하고 각보기 컨트롤러에서도 sessionConfig.HTTPMaximumConnectionsPerHost = 1을 설정하는 것이 좋습니다. 나는 이것이 한 번에 서버에 하나의 연결로 앱을 제한하기를 바라고 있습니다. – Scooter

답변

1

NSURLSession은 http 연결에 동일한 설정을 적용하기 쉽게 만들어졌습니다.

[NSURLSession sharedSession]을 수정없이 사용할 수 있습니다. (수정시 임시 세션이 포함되어 데이터가 캐시되지 않거나 모든 요청에 ​​동일한 헤더 데이터를 추가하는 세션이 있습니다. 자세한 내용은 NSURLSessionConfiguration을 참조하십시오.)

NSURLSession은 원래의 질문으로 돌아갑니다. 네트워크 연결을 열지 마십시오. 주변을 지킬 때 단점은 없습니다. 각 UIViewController에 대해 비슷한 응용 프로그램을 만드는 대신 전체 응용 프로그램에 대해 하나를 유지할 수 있습니다.

NSURLSessionTask (또는 해당 하위 클래스 중 하나)을 만들고 해당 개체에서 을 호출하면 네트워크 연결이 만들어집니다. 그것들은 조심해야 할 대상입니다. 일단 시작하면 완료되거나 실패 할 때까지 백그라운드에서 실행됩니다. 현재 UIViewController를 종료해도 종료되지 않습니다.

하나는 UIViewController 당 NSULRSession을 유지하고 다음과 같은 것을 추가하는 것입니다. 현재 페이지에서 다른 페이지로 이동할 때 보류중인 다운로드가 종료됩니다.

- (void)viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 
    [session invalidateAndCancel]; 
} 

또 다른 시도는 NSURLSessionConfiguration 객체에 시간 초과를 추가하는 것입니다.

는 수신 된 데이터의 마지막 부분에서 5초되었으며, 두번째는 전체 요청을 2 분 후 타임 아웃을두고있는 요구를 중지
config.timeoutIntervalForRequest = 5; 
config.timeoutIntervalForResource = 120; 

제. 가치와 함께 플레이하고 그들이 더 나아 졌는지 확인하십시오.

+0

내 마지막 코멘트에서 나는 viewWillDisappear 메서드에서 [session invalidateAndCancel] 호출을 주차하겠다고 말했지만 결과를 논의하기 위해 다시는 돌아 오지 않았습니다. 그래서 저는 여러분에게 답을 알려주고 있습니다. 그리고 이해하기 쉽고 완전하고 이해하기 쉬운 답을 주셔서 감사합니다! 최종 결과는 도움이되었지만 결국에는 동시 사용자 부하를 처리하기 위해 경제 호스팅 계획에서 서버를 Virtual Private Server로 업그레이드해야했습니다. 큰 반응에 다시 한 번 감사드립니다! – Scooter

관련 문제