2014-04-17 2 views
0

저는 iOS 7.1 용으로 첫 번째 응용 목적을 작성했습니다. 나는 아마도이 질문이 왜 생겨 났는지 근본적으로 이해하지 못하는 것이 될 것입니다.NSURLSession을 사용하여 간단한 ios 응용 프로그램을 디자인하십시오.

응용 프로그램은 매우 간단합니다. 클라이언트가 웹 API를 사용하여 외부 서비스와 통신합니다. HTTP 요청을 보내려면 NSURLSession을 사용합니다. 간단한 아키텍처가 있습니다.

THETALETestViewController -이보기 컨트롤러. 이 클래스는 THETALEAPI.h를 사용합니다. THETALEAPI - 웹 API의 실현입니다. 별도의 클래스에서 강조 표시 한 것처럼 각 외부 API 메소드가 한 곳에서 구현되었습니다. 다음은 각 메소드에 대한 질의의 형성입니다. 이 클래스는 THETALEHttpHandler.h를 사용합니다. THETALEHttpHandler -이 클래스는 http 요청을 보내고 http 응답을받는 것을 직접 담당합니다.

POST 쿼리를 보내는 THETALEHttpHandler.m의 코드는 다음과 같습니다. 메인 쓰레드가 실행 - 요청을 전송하고 수신 및 처리 응답이 동안, 그래서

-(void) sendPostToURL:(NSURL *)url withParams: (NSString *) inParams competion:(void  (^) (NSData *data)) completion 
{ 
    NSLog(@"sendPostToURL"); 

    // _csrftoken a token in cookie 
    NSMutableDictionary *cookieProperties = [NSMutableDictionary dictionary]; 
    [cookieProperties setObject:@"csrftoken" forKey:NSHTTPCookieName]; 
    [cookieProperties setObject:_csrftoken forKey:NSHTTPCookieValue]; 

    [cookieProperties setObject:[[NSDate date] dateByAddingTimeInterval:2629743] forKey:NSHTTPCookieExpires]; 

    NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:cookieProperties]; 
    [_httpCookieStorage setCookie:cookie]; 

    [_sessionConfig setHTTPCookieStorage:_httpCookieStorage]; 


    // tried and so 
    // // NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration: defaultConfigObject delegate: nil //delegateQueue: [NSOperationQueue mainQueue]]; 
    NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration:_sessionConfig]; 


    NSMutableURLRequest * urlRequest = [NSMutableURLRequest requestWithURL:url]; 

    // _csrftoken a token in the parameter 
    NSString *params = [@[inParams, _csrftoken] componentsJoinedByString:@""]; 

    [urlRequest setHTTPMethod:@"POST"]; 
    [urlRequest setHTTPBody:[params dataUsingEncoding:NSUTF8StringEncoding]]; 

    NSURLSessionDataTask * dataTask =[defaultSession dataTaskWithRequest:urlRequest 
                completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 
                NSLog(@"Got response %@ with error %@.\n", response, error); 
                 if(error == nil) 
                 { 
                  NSString * text = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding]; 
                  NSLog(@"Data = %@",text); 
                 } 
                completion(data); 
                }]; 
    [dataTask resume]; 

} 

그래서, 블록 완성, 비동기 메인 스레드에서 실행하고 있지 않습니다. 원칙적으로 명확하고 논리적이지만,이 메소드를 사용하여 각각 "로그인"하고 싶습니다. "로그인"을 클릭하면 성공한 요청 및 응답을 처리하고 사용자가 응답을 처리해야합니다. iOS가 비동기 블록 완료를 기다리는 주 스레드에 대한 이러한 동작을 달성하고 적절한 정보를 표시하는 기능은 무엇입니까? 아니면 기다릴만한 가치가없는 것일 수도 있으며, 어떻게 든 알릴 필요가 있습니까? 물론, 별도의 클래스를하지 않으며,의 ViewController에서 모든 일을,하지 않는 한

, 다음, 대표가 올 것이다,하지만 나는 그것의 응용 프로그램에서 모듈 방식의 비트를 만들고 싶어한다고 가정.

어쩌면 내가 잘못 설계 한 시스템이고, 그러면 보통 어떻게 수행되는지 예를 설명하거나 보여줄 수 있습니까?

저는이 요구 사항이 다소 진부하고 대답이 어딘가에 있다고 생각합니다. 사전에 설명해 주셔서 감사합니다.

+0

죄송합니다. 코드의 주석을 번역했습니다. – njc

답변

1

AFNetworking을 API 호출에 사용할 수 있습니다. Tutorial 어떻게 올바른 방법으로 사용하는지 자세히 설명합니다. 또한 NSNotificationCenter을 사용하면 호출이 성공/실패했을 때보기 컨트롤러에 알릴 수 있습니다.

+0

알림 및 위임자에 대해 생각해 보았습니다. 거기에 컨트롤러를보기 위해 차단 알림을 사용해야합니다. – njc

+0

귀하의 질문을 이해할 수 있는지 확실하지 않습니다. – wootage

+0

구현에 관심이 있습니다. 지정된 아키텍처 내에서 알림은 어떻게 처리합니까? – njc

0

먼저, dispatch_sync을 사용하여 주 스레드에서 블록을 실행할 수 있습니다. 그러나 실제로는 문제가 아닙니다. 하나의 코드 블록에서 너무 많은 것을하려고합니다.

  1. 는 사용자 이름/암호를 기록한 :

    귀하의 흐름은 다음과 같이 보일 필요가 있겠습니까?

  2. 하지 않는 경우, 네트워크 요청을 실행 한
  3. 을 요청
  4. 요청이 취소 될 수와 코드가 단계로 점프 할 경우에 처리가 잘못된 자격 증명을 찾고 포함 할 것이다
  5. 오류, 2
+0

왜 내가 한 블록에서 너무 많이하기를 원한다고 생각합니까? 나는 단지 응답을 받아들이고 그것을 THETALEAPI에서 더주고 싶다. 'code'dispatch_sync 'code'를 사용하려고했지만 프로그램이 블록 실행을 기다리지 않았습니다.내 질문은 실제로 목록에 설명 된 것을 구현하는 방법입니다. – njc

+0

@njc 코드 아래에있는 텍스트 단락은 사용자가 네트워크 요청에서 로그인하라는 메시지를 표시하도록 제안합니다. 즉, 계속하기 전에 사용자가 정보를 얻을 때까지 네트워크 요청이 대기해야합니다. 그것이 어떻게 작동해야하는지가 아닙니다. 자격 증명을 얻은 다음 요청을 수행해야합니다. –

+0

아마 내가 잘못 설명했다. 이미 자격 증명이 있으면 사용자가 입력합니다. 이제는 답변을 기다리고 싶고 답변에 따라 사용자 인터페이스에 정보를 표시하고 싶습니다. – njc