2014-04-09 3 views
1

일부 서버 쿼리 블록이 작업을 종료 할 때까지 대기 할 수 있습니까? 내 unworking 코드는 아래 있습니다.대기 블록을 완료 할 수 있습니까?

+ (BOOL) loginQueryFromServer:(NSDictionary *)parameters{ 

    __block BOOL loginQueryResult = NO; 

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 

    AFHTTPRequestOperation *operation = [manager POST:@"http://domainname/login/" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) { 

    NSLog(@"Response1: %@",responseObject); 
    loginQueryResult = YES; 
    NSLog(@"Response2: %@", loginQueryResult ? @"YES" : @"NO"); 
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 

    NSLog(@"Error: %@", error); 
    loginQueryResult = NO; 
    }]; 
    [operation start]; 
    [operation waitUntilFinished]; 

    NSLog(@"Response3: %@", loginQueryResult ? @"YES" : @"NO"); 
    return loginQueryResult; 
} 

결과 : (당신이 볼 수 있듯이, Response3 먼저 로그) 당신은 타사에게 AFNetworking 라이브러리를 사용하고

2014-04-09 21:11:17.072 aaa[1010:70b] Response3: NO 
2014-04-09 21:11:17.073 aaa[1010:70b] Response1: { 
    reply = "Login successful!"; 
} 
2014-04-09 21:11:17.081 aaa[1010:70b] Response2: YES 
+0

이 응답을 살펴 보자 http://stackoverflow.com/questions/20476957/afnetworking-2-waituntilfinished-not-working –

+0

를 당신에게 마티아스 감사 ,하지만 나는 이미 그걸 시도했다. 나는 에드윈스의 답변 인 해결책을 찾는다. – AykutE

답변

2

이 질문에 정확히 대답하지 않는다는 것을 알고 있습니다.하지만 loginQueryFromServer : 메서드를 다시 작성하여 비동기 적으로 처리 할 것을 제안합니다. (이것이 궁극적으로 당신이하려는 일이라고 생각합니다.)

+ (void) loginQueryFromServer:(NSDictionary *)parameters completion:(void(^)(BOOL response, NSError *error))completionBlock { 

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 

    AFHTTPRequestOperation *operation = [manager POST:@"http://domainname/login/" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) { 

     completionBlock(YES, nil); 

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 

     completionBlock(NO, error); 
    }]; 
    [operation start]; 
} 

것은이처럼 사용

[YourClass loginQueryFromServer:someDictionary completion:^(BOOL response, NSError *error) { 

    // do something with the response and the error if it exists 
}]; 
+0

네, 그게 내가하려고하는 일입니다. 완벽하게 작동했습니다, 고맙습니다. 고맙습니다. .. – AykutE

1

. 그래서 질문은 : 개발자가 작업이 끝나면 무언가를 할 수 있기를 원했습니까?

대답은 yes입니다 :

내장 NSOperation에 의해 제공 completionBlock 요청이 완료된 후 실행되는 사용자 정의 행동 할 수 있습니다.

사용중인 클래스는 NSOperation의 하위 클래스입니다. 따라서 블록을 completionBlock property에 할당하십시오.

+0

토미 감사합니다, 에드윈은 이미 competionBlock과 관련된 답변을 게시했습니다. 감사합니다. – AykutE

+0

허영심 논평 : 기술적으로 그는 _subsequent_ 조금 더 나쁜 대답을 게시했습니다. 'NSOperation'이 이미'completionBlock'을 제공한다면, 왜 자신의 코드를 작성하여 하나를 호출해야합니까? – Tommy