강제

2014-10-30 3 views
0

나는 사용자가/로그인 할 수 없습니다 수 있는지 확인하기 위해 웹 서비스의 응답을 로그인 정보와 대기를 시도 보내는 URLRequest을 만들고있어 NSURLSessionDataTask 완료 될 때까지 기다립니다.강제

내가 기대했다 방법을 이렇게하려면 사용자 입력을 사용자 이름 & 암호 두 개의 텍스트 필드에 입력하고 버튼을 누르면 아래 기능이 호출됩니다. 이 함수는 NSURLSessionDataTask을 시작하고 부울 성공/실패 (로그인이있는 경우)과 NSString (해당하는 경우)이있는 구조체를 생성합니다.

문제는 내 NSURLSessionDataTask's 완료 블록 실행이 완료되기 전에 내 함수가 구조체를 반환한다는 것입니다. 이 작업이 종료되거나 완료 될 때까지 내 프로그램이 대기하도록 강제 할 수있는 방법이 있습니까? 또는 함수가 반환되기 전에 완료 블록 실행을 기본 스레드 &으로 푸시 할 수 있습니까?

감사합니다. 제가해야 할 설명이 있는지 알려주세요.

(또한 GCD에 대해 언급 한 StackOverflow를 둘러싼 유사한 질문을 보았습니다.이 질문은 잔인한 해결책입니까? 그 질문은 전혀 똑같은 것을 말하는 것 같지 않습니다. 내 현재의 이해 내가 목표 - C로 여전히 매우 새로운 오전)

- (struct RequestReport) sendLoginRequest: (NSString*) username withPassword: (NSString *) password 

(요청 & 설정 HTTP 본문을 작성)

NSURLSessionDataTask *dataTask = [self.session dataTaskWithRequest:request completionHandler: ^(NSData *data, NSURLResponse *response, NSError *error){ 

    NSDictionary *jsonObject = [NSJSONSerialization JSONObjectWithData: data options:0 error:nil]; 

    success = (BOOL)jsonObject[@"success"]; 
    statusText = (NSString *) jsonObject[@"errors"]; 

}]; 

[dataTask resume]; 

struct RequestReport rr; 
rr.status = statusText; 
rr.success = success; 

return rr; 
+0

이 유형의 문제에 대한 일반적인 디자인 패턴은 작업이 반환 될 때 실행되는 콜백 블록을 전달하고 중간에로드 표시기를 표시하는 것입니다. 메서드는 void 여야하며 콜백 블록은 NSURLSessionDataTask의 콜백에서 실행됩니다. – DBoyer

+0

아, 나는 더 많은 방법을 써야하는 것을 싫어한다 : PI는 또 다른 해결책이 있기를 바라고있다. 특히 사용자가 로그인 할 때까지 프로그램이 실제로 "차단"해야하기 때문에. 보안상의 이유로, 기록되지 않는 기능은 없다. 사용자. – 13rave

+0

오, 당신은 다른 방법을 쓰는 것이 아닙니다. 콜백 블록? 그래서, 델리게이트 함수 (Objective-c에서 무엇을 호출했는지 확실하지 않음)를 로그인 함수의 매개 변수로 전달하는 것? – 13rave

답변

4

다음과 같아야합니다 귀하의 방법.

- (void) sendLoginRequest:(NSString*) username withPassword:(NSString *) password callback:(void (^)(NSError *error, BOOL success))callback 
    { 
    NSURLSessionDataTask *dataTask = [self.session dataTaskWithRequest:request completionHandler: ^(NSData *data, NSURLResponse *response, NSError *error){ 
     if (error) { 
      // Handle error 
     } 
     else { 
      callback(error, YES); 
     } 
    }]; 

    [dataTask resume]; 

} 

콜과 같이이 방법 :

[self sendLoginRequest:@"myUsername" password:@"password" callback:^(NSString *error, BOOL success) { 
    if (success) { 
     NSLog(@"My response back from the server after an unknown amount of time"; 
    } 
} 

더 블록 읽기 및 블록을 선언하는 방법에 대한 fuckingblocksyntax.com에 대한 Apple's Programming with Objective-C를 참조하십시오.

+0

고마워요. 나는 이것에 대해 완전히 잘못된 생각을 해왔다. 콜백을 살펴 보겠습니다. – 13rave

+0

나는 구문에 대해 약간 혼란 스럽다. – 13rave

+0

(oops, 나는 Enter 키를 의미하지 않았다.) (void (^) (NSArray * objects)) 콜백 ^ NSArray * 객체는 무엇입니까? – 13rave