2017-03-29 2 views
0

우선이 질문이 이미 존재한다고 생각하지 않지만 비슷한 게시물이 있다는 것에 동의합니다. 계속 읽으십시오."연결 중"상태에서 NSUrlConnection을 중단하십시오.

제 질문은 : NSUrlConnection을 "연결 중"상태로 중단하는 방법은 무엇입니까? 연결이 이루어진 후 NSUrlConnection cancel 메서드를 사용하여 요청을 취소 할 수 있습니다. 그러나 서버가 응답을 제공하지 않을 때 (위임 호출을 받기 전에) 제한 시간에 도달하기 전에 "연결"상태에서이를 중단하는 방법은 무엇입니까?

시간 내 주셔서 감사합니다.

내가 그 (그 방법 cancel으로) 할 대신 NSUrlConnectionNSURLSession​Task을 사용해야 EDIT?

편집 2 - 코드 샘플

NSURLConnection* m_connection; 
m_connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO]; 
if(m_connection){ 
    [m_connection start]; 

    m_timer = [NSTimer scheduledTimerWithTimeInterval: FLT_MAX 
               target: self selector: @selector(doNothing:) 
              userInfo: nil repeats:YES]; 
    m_runLoop = [NSRunLoop currentRunLoop]; 
    [m_runLoop addTimer:m_timer forMode:NSDefaultRunLoopMode]; 
    while (m_bRunLoop && [m_runLoop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]); 

    [m_connection cancel]; 
} 

나는 데이터를 스트리밍 내 연결을 사용합니다. 보시다시피, 지금은 연결 설정을 m_bRunLoop에서 false으로 중단하고 괜찮습니다. 하지만 내 질문은 : 서버가 응답을 보내기 전에 내 연결을 중단하는 방법, 전체 시간 초과를 기다리지 않고?

+0

NSURLConnection 인스턴스를 생성하는 코드를 게시 할 수 있습니까? 취소하려는 인스턴스는 동일한 클래스 또는 다른 클래스에서 작성한 것입니까? –

+0

다른 게시물이나 다른 수업을 편집했거나 동일하지 않아도 처리 할 수 ​​있습니다. – N0un

답변

1

[NSURLConnection cancel]을 계속 호출하면 연결을 취소하고 더 ​​이상 대리인을 지정할 수 없습니다. 다시 연결하려면 새 연결 개체를 만들어야합니다. 귀하의 질문에서 오히려 어떤 문제가 있다고 생각합니까? cancel 대리인의 전화를 받기 전에 전화를해야합니까?

또한 데이터 작업과 함께 NSURLSession API를 사용하는 것이 좋습니다. 대부분의 경우 네트워킹을 처리하는 더 좋은 방법 일 수 있습니다.

EDIT (사용자가 추가로 코드) : 모든

첫째, NSTimer가 실행 루프에 대한 입력 소스로 간주되지 않습니다로 실행 루프에 타이머를 추가하면 (만약 여기에 아무 것도 변경하지 않습니다 당신은 정말로 "아무것도하지 않습니다").

두 번째 - m_bRunLoop을 false로 설정하면 코드를 제공하지 않더라도 어딘가에서 작업을 수행 할 수 있지만 연결을 취소 할 장소가되므로 여기에 "cancelConnection"메서드를 지정하십시오. ,

- (void)cancelConnection { 
    //m_bRunLoop = false <- this was before here 
    [m_connection performSelector:@selector(cancel) onThread:yourConnectionThread withObject:nil waitUntilDone:YES]; 

} 

마지막 : 당신은 당신이 연결을 시작하는 스레드에 취소 호출 할 필요가 있음을 기억

m_connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO]; 
if(m_connection){ 
    yourConnectionThread = [NSThread currentThread]; // store your thread in instance variable 
    [m_connection start]; 

    m_timer = [NSTimer scheduledTimerWithTimeInterval: FLT_MAX 
               target: self selector: @selector(doNothing:) 
              userInfo: nil repeats:YES]; 
    m_runLoop = [NSRunLoop currentRunLoop]; 
    [m_runLoop addTimer:m_timer forMode:NSDefaultRunLoopMode]; 

} 

을하고 연결을 취소 방법을 구현 :

는 다음과 같이 코드를 수정 주석보다는 오히려 NSRunLoop은 쓰레드에 안전하지 못하기 때문에 다른 쓰레드에서 그 메소드를 호출해서는 안된다는 것을 기억하십시오.

+0

예, 내 대리인 호출을 받기 전에 취소하는 것이 좋습니다. – N0un

+0

그러면 코드 아키텍처의 문제입니다.빠른 패치로서 요청을 수행하는 클래스의'NSDictionary' 인스턴스 변수에서 시작된 모든 'NSURLConnections'를 저장할 수 있으며, 연결을 취소하기위한 "올바른 장소와 시간"에있을 때 사전에서 올바른 것을 선택하고 그것에'취소'. –

+0

글쎄, 아키텍처에 대해 이야기하기 위해, 나는 초기화를하고 (스트림 데이터에 사용되는) 연결을 시작하는'NSThread '를 가지고있다. 문제를 해결하기 위해 언제든지 연결을 중단 할 수 있기를 원한다. 이 스레드에서 "참여"하고 시간 제한에 도달 할 때까지 기다리지 않으려 고합니다. – N0un