2016-06-23 2 views
0

앱을 빌드 할 때 NetEngine이라는 클래스를 만들어 모든 네트워크 요청을 관리합니다. 그러나 NetEngine을 사용하는보기 컨트롤러를 종료 한 후에도 여전히 성공 또는 실패 블록을 호출합니다.보기 컨트롤러를 종료 한 후 콜백 블록을 호출하지 마십시오.

의 ViewController :

[[NetEngine engine] GET:httpUrl success:^(id responseObject) { 
     //some code here 
     //It's still called after I quit viewctroller 
    } failure:^(NSError *error) { 
     //some code here 
     //It's still called after I quit viewctroller 
    }]; 

NetEngine :

만들기 :

typedef void(^SuccessBlock) (id responseObject); 
typedef void(^FailureBlock) (NSError *error); 

@interface NetEngine() 

@property (nonatomic, strong) AFHTTPSessionManager *httpManager; 

@end 

@implementation NetEngine 

+ (NetEngine *)engine { 
    static NetEngine *_sharedEngengine = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     _sharedEngengine = [[self alloc] init]; 
    }); 

    return _sharedEngengine; 
} 

- (id)init { 
    if (self = [super init]) { 
     _httpManager = [[AFHTTPSessionManager alloc] initWithBaseURL:[NSURL URLWithString:BZTVBaseServerPath]]; 
     [_httpManager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"accept"]; 
     _httpManager.requestSerializer.cachePolicy = NSURLRequestReloadIgnoringLocalCacheData; 
     _httpManager.operationQueue.maxConcurrentOperationCount = 4; 
     [_httpManager.requestSerializer setTimeoutInterval:10.0]; 
    } 
    return self; 
} 

- (void)GET:(NSString *)URLString success:(SuccessBlock)successBlock failure:(FailureBlock)failureBlock { 
    // some thing about cache 

    [_httpManager GET:encodeUrl parameters:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nonnull responseObject) { 
     [[self defaultCache] setObject:responseObject forKey:cacheKey]; 
     if (successBlock) { 
      successBlock(responseObject); 
     } 
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { 
     if (isCache) {    
      if (successBlock) { 
       successBlock([[self defaultCache] objectForKey:cacheKey]); 
      } 
     } 
     if (failureBlock) { 
      failureBlock(error); 
     } 
    }]; 
} 
+0

때문이다. 들어오는 응답을 잡아 당겨야합니다! View Controller를 종료하기 전에 유효한 응답을 확인하십시오. 사용 가능한 경우 VC를 종료하고 응답을 기다립니다. –

+0

@TejaNandamuri 네 말이 맞지만 내게 좀 더 조언 해 줄래? 또는 들어오는 응답을 처리하는 방법에 대한 몇 가지 기사가 있습니까? 고마워. –

+0

나는 이것에 관해 어떤 게시물도 없을 것이라고 생각한다. 이것은 모두 귀하의 요구 사항에 달려 있습니다. 당신이하려는 일에 대해 더 많은 정보를 제공해야합니다. –

답변

0

당신이 당신의 뷰 컨트롤러를 종료 할 때 네트워크 호출을 취소하려면, 여기 당신이해야 할 무엇 cancelBOOL 변수

viewWillDisappear 방법 :

-(void) viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 

    cancel = YES; 
} 

확인 취소하면 콜백 메서드에서 YES입니다 : 문서에서

[[NetEngine engine] GET:httpUrl success:^(id responseObject) { 
     //some code here 
     //It's still called after I quit viewctroller 
     if (!cancel) { 
      //do what you have to do 
     } 
    } failure:^(NSError *error) { 
     //some code here 
     //It's still called after I quit viewctroller 
     if (!cancel) { 
      //do what you have to do 
     } 
    }]; 
+0

좋은 답변입니다 !!! 그것은 작동합니다! –

+0

친구를 도와 줘서 기뻐. :) – AnthoPak

1

: "블록은 언어 수준의 기능을 허용 C, 오브젝티브 C와 C++에 추가 메서드 나 함수에 전달할 수있는 코드의 구분 세그먼트를 만들 수 있습니다. " 따라서 블록 자체는 객체이기 때문에 객체를 만든 객체에 의존하지 않는 라이프 사이클을 가지고 있습니다.

NetEngine에 부여한 코드를 사용하지 않으려면보기 컨트롤러를 "종료"할 때 해당 정보를 전달해야합니다. 기본적으로

: 네트워크 호출이 비동기 및 URL이 응답을 반환 할 때 결코 알지 못할

[[NetEngine engine] GET:httpUrl success:^(id responseObject) { 
    // if the view controller still wants me to do this { 
     //some code here 
    // } 
} failure:^(NSError *error) { 
    // if the view controller still wants me to do this { 
     //some code here 
    // } 
}]; 
+0

당신이 완전 하군! 그리고 @Anthonin이 해결할 수있는 방법을 찾았습니다! –

관련 문제