저는 IOS 개발에 익숙하지 않으므로 일부 기본 사항이 누락되었을 수 있습니다. 이미이 문제로 2 일 동안 고생하고 있습니다. 그래서 여기 있습니다.AFNetworking 3.0을 사용하여 비동기 블록에서 응답을 얻을 수 없습니다.
//request generation, putting url and dictionary into it
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];
NSURLSessionDataTask *dataTask = [manager dataTaskWithRequest:request completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
if(!error)
{
self.jsonDictionary = responseObject;
NSInteger HTTPStatusCode = [(NSHTTPURLResponse *)response statusCode];
NSLog(@"RESPONSE DATA: %@", self.jsonDictionary);
self.didSendRequest = YES;
}
else
{
self.didSendRequest = NO;
NSLog(@"ERROR: %@", error);
}
}];
[dataTask resume];
을 그리고 다음과 같이 JSON 사전을 검색 : 내 API 클래스에서 데이터 작업을
-(NSDictionary *)returnJSON{
if(self.didSendRequest) return self.jsonDictionary;
else NSLog(@"No dictionary dowloaded");
return self.jsonDictionary;}
그럼, 데이터 작업 방법에 URL과 사전을 통과 다른 클래스, 다만이 같은 응답을 얻을 :
-(NSDictionary*)userLogin : (NSString*)email : (NSString*) password {
dataTaskClass* aph = [[dataTaskClass alloc] init];
NSDictionary *userParams = [[NSDictionary alloc] initWithObjectsAndKeys:
email,@"email",
password,@"password",
nil];
[aph postRequest: @"myUrl"];
return dataTaskClass.returnJSON;}
을 그리고 마지막으로 나는이처럼 내보기 컨트롤러 클래스에서 호출 :
를 0//button click method here
response = [lh userLogin : userEmail : userPass];
if (response) {//do some action}
그래, 볼 수 있듯이 메서드를 호출하면 비동기 적으로 다운로드 작업을 수행 한 후 반환 값을 즉시 확인합니다. 즉 "null"입니다. 그렇다면 return 값을 dataTask와 동기화하거나 완료를 다른 방식으로 확인하려면 어떻게해야합니까?
이미 "멍청한"while 루프와 세마포어 접근 방식을 사용하여 예상대로 주 스레드를 걸었습니다. 알림으로 시도했지만 아무 것도 안 남았습니다.
나는 그게 단순한 해결책을 가지고 있다고 확신하지만 그것을 얻을 수는 없다.
도움이 될 것입니다.
URL이 실제 데이터로 유효한 json 인코딩 응답을 실제로 반환하고 있는지 확인하여 시작할 것입니다. 아마도 URL이 로그 파일에 반환 할 데이터를 쓰도록해야합니다. – DontKnow
아니요, URL은 괜찮습니다. 이전에 NSURLSession을 사용하고 while 회 돌이로 응답을 기다렸습니다. 문제는 NSURLSession에서 API를 사용하는 데 문제가있어서 AFnetworking으로 이동해야했습니다. 어쨌든, 완성 블록을 사용하는 것이 유일한 정답입니다. – briznichenko