在sharedInstance中阻止并取消

时间:2013-11-05 11:23:49

标签: ios objective-c block grand-central-dispatch afhttpclient

我有一个从互联网上下载的功能。然后它映射项目并将所有内容返回给控制器。问题是可能有很多项目(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
        });
}

3 个答案:

答案 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}}发送消息不会执行任何操作。

您可以选择所需的方式。