저는 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에서 모든 일을,하지 않는 한
, 다음, 대표가 올 것이다,하지만 나는 그것의 응용 프로그램에서 모듈 방식의 비트를 만들고 싶어한다고 가정.
어쩌면 내가 잘못 설계 한 시스템이고, 그러면 보통 어떻게 수행되는지 예를 설명하거나 보여줄 수 있습니까?
저는이 요구 사항이 다소 진부하고 대답이 어딘가에 있다고 생각합니다. 사전에 설명해 주셔서 감사합니다.
죄송합니다. 코드의 주석을 번역했습니다. – njc