退出视图控制器后不要调用回调块
Don't call callback block after exiting view controller
当我构建我的应用程序时,我创建了一个名为 NetEngine 的 Class 来管理所有网络请求。但是我发现在退出使用 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
}];
网络引擎:
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);
}
}];
}
如果您想在退出视图控制器时取消网络调用,请执行以下操作:
创建一个cancel
BOOL
变量
添加 viewWillDisappear
方法:
-(void) viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
cancel = YES;
}
检查回调方法中的 cancel 是否为 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
}
}];
来自文档:"Blocks are a language-level feature added to C, Objective-C and C++, which allow you to create distinct segments of code that can be passed around to methods or functions as if they were values"。因此,块本身是一个对象,这意味着它的生命周期不依赖于创建它的对象。
如果您不想 NetEngine
使用您提供给它的代码,您需要一种在 "quit" 视图控制器时将信息传递给它的方法。
基本上:
[[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
// }
}];
当我构建我的应用程序时,我创建了一个名为 NetEngine 的 Class 来管理所有网络请求。但是我发现在退出使用 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
}];
网络引擎:
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);
}
}];
}
如果您想在退出视图控制器时取消网络调用,请执行以下操作:
创建一个cancel
BOOL
变量
添加 viewWillDisappear
方法:
-(void) viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
cancel = YES;
}
检查回调方法中的 cancel 是否为 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
}
}];
来自文档:"Blocks are a language-level feature added to C, Objective-C and C++, which allow you to create distinct segments of code that can be passed around to methods or functions as if they were values"。因此,块本身是一个对象,这意味着它的生命周期不依赖于创建它的对象。
如果您不想 NetEngine
使用您提供给它的代码,您需要一种在 "quit" 视图控制器时将信息传递给它的方法。
基本上:
[[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
// }
}];