我有一个从互联网上下载的功能。然后它映射项目并将所有内容返回给控制器。问题是可能有很多项目(Facebook不允许划分它们),我必须在后台映射它们。但是,用户可以退出控制器,我不知道如何检查我的success()
所有者是否仍然存在。
将映射放在发送中是否是一个很好的解决方案......?
呼叫:
[[MyHTTPClient sharedInstance] getSomethingWithAbc:abc successBlock:^{
[self reloadMyView];
} failureBlock:^(NSError *error) {
//nothing atm
}];
其中:
@interface MyHTTPClient : AFHTTPClient
+ (OHTTPClient *)sharedInstance;
- (void)getSomethingWithAbc:(ABC *)abc successBlock:(void (^)())success failureBlock:(void (^)(NSError *error))failure;
方法实施:
- (void)getSomethingWithAbc:(ABC *)abc successBlock:(void (^)())success failureBlock:(void (^)(NSError *error))failure {
// request something from facebook API, wait for response then run:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
// here map these items - there may be a lot of them so i have to do it in background
dispatch_async(dispatch_get_main_queue(), ^{
success(); // this may call a function from controller that does not exist already
});
}
答案 0 :(得分:0)
这很好,但你应该进行cancel
操作,这样在调用success
之前,你可以检查操作是否已被取消。
答案 1 :(得分:0)
您最好编写一个独立于您的控制器的网络处理模块,并将委托方法设置为 - (void)didSuccessWithResult:(NSDictionary *)result; - (void)didFailWithError:(NSError *)error;
或发送通知
在您的网络处理模块中,您可以使用MyHTTPClient定义下载工作以完成代理方法
希望有用
答案 2 :(得分:0)
然而,用户已经退出控制器,我不知道如何 检查我的success()所有者是否仍然存在。
如果所有者“仍然存在”,您的意思是什么?
块保留 self
。这意味着只要块存在,“所有者”将“仍然存在”。因此,如果您调用success()
并且控制器不再显示,那么reloadMyView
将会“重新加载”不再显示的视图reloadMyView
。这可能无关紧要。
如果您不想拨打nil
该怎么办?好吧,你可以让块捕获对“所有者”的弱引用。这不会阻止它像通常那样被解除分配。然后,当您调用成功块并取消分配对象时,您使用的弱引用将具有值nil
,并且向{{1}}发送消息不会执行任何操作。
您可以选择所需的方式。