2016-06-23 5 views
0

私のアプリケーションをビルドすると、NetEngineというクラスを作成して、すべてのネットワーク要求を管理します。しかし、NetEngineを使用するView Controllerを終了した後でも、私はまだ成功または失敗ブロックを呼び出していることがわかります。View Controllerを終了した後にコールバックブロックを呼び出さないでください

の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

ので。あなたは着信応答を警戒する必要があります!ビューコントローラを終了する前に有効な応答をチェックし、使用可能な場合は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、のObjective-CとC++、に追加されますメソッドや関数に値として渡すことができるコードの別個のセグメントを作成する必要があります。したがって、ブロック自体はオブジェクトです。つまり、ブロックを作成したオブジェクトに依存しないライフサイクルを持つことを意味します。

NetEngineに与えたコードを使用したくない場合は、View Controllerを終了するときにその情報を渡す方法が必要です。基本的には

:ネットワーク呼び出しは非同期で、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は私にそれを解決する方法を得る! –

関連する問題