0

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

3 回答 3

0

这很好,但您应该有一个cancel操作,以便在调用 之前success,您可以检查该操作是否已被取消。

于 2013-11-05T11:50:18.893 回答
0

你最好写一个独立于你的控制器的网络处理模块,并将委托方法设置为 - (void)didSuccessWithResult:(NSDictionary*)result; - (void)didFailWithError:(NSError*)error;

或发送通知

在您的网络处理模块中,您可以使用 MyHTTPClient 定义下载工作以完成代理方法

希望有帮助

于 2013-11-05T12:00:14.373 回答
0

但是用户已经可以退出控制器,我不知道如何检查我的 success() 所有者是否仍然存在。

如果所有者“仍然存在”,您是什么意思?

self由块保留。这意味着只要块存在,“所有者”将“仍然存在”。因此,如果您调用success()并且控制器不再显示,那么它将reloadMyView(取决于您的函数所做的)将“重新加载”不再显示的视图。这可能无关紧要。

如果您根本不想打电话reloadMyView怎么办?好吧,您可以让块捕获对“所有者”的弱引用。这不会阻止它像往常一样被释放。然后,当您调用成功块并释放对象时,您正在使用的弱引用将具有 value nil,并且发送消息到nil什么都不做。

你可以选择你想要的方式。

于 2013-11-05T20:20:15.673 回答