【问题标题】:Custom Object Download Manager自定义对象下载管理器
【发布时间】:2017-01-19 10:55:00
【问题描述】:

我被困在这里。我创建了一个自定义类来下载图像。我想做的是为其中一种方法创建一个完成块。

例如:

CustomObj *obj = [[CustomObj alloc] init];
[obj downloadImage:url withCompletion:(BOOL *finished) {

 //do stuff
}];

问题出在 CustomObj 中,我使用 2 个 NSURLSessions 下载图像,每个都是块。基本上第一个会话首先开始,然后第一个会话完成,将运行第二个会话,并且在第二个会话完成时,我想触发我的自定义完成。不知道该怎么做。请帮忙谢谢。

【问题讨论】:

  • 这有什么问题?
  • 如何完成自定义类,在另一个完成后触发。

标签: ios objective-c objective-c-blocks completionhandler


【解决方案1】:

你可以这样做

Customobj.h

+(void)downloadImage:(NSString *) url
                 success:(void(^)(BOOL finished))success
                 failure:(void(^)(NSString *errorMessage))failure;

Customobj.m

+(void)downloadImage:(NSString *) url
             success:(void(^)(BOOL finished))success
             failure:(void(^)(NSString *errorMessage))failure

{
    if(success)
  {
    success(success);
  }
  else{
    failure(errorMessage);
  }
}

然后你可以像这样使用它:

 [Customobj downloadImage:url success:^(BOOL finished) {

    } failure:^(NSString *errorMessage) {

    }];

【讨论】:

  • 成功时出现错误(YES); “成功”的隐式声明在 C99 中无效
  • 好的,这似乎可行。错误是我的错。我很快就会接受这个答案。
【解决方案2】:

你完全可以将块嵌套在其他块中。

这里是一个小例子,只是为了展示它是如何工作的。显然这里的方法很空白,但它只是让你有一个想法:

- (void) networkCallWithCompletionBlock:(void (^)(NSString *response))completed {
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        completed(@"My amazing response");
    });
}

- (void) methodWithCompletionBlock:(void (^)(BOOL success))completed {
    [self networkCallWithCompletionBlock:^(NSString *response) {
        completed([response isEqualToString:@"My amazing response"]);
    }];
}

- (void) buttonPress() {
    [self methodWithCompletionBlock:^(BOOL success) {
        NSLog(@"%@", @(success));
    }];
}

每当你调用buttonPress方法时,都会触发两个异步方法的链,并在0.5秒后打印消息。

【讨论】:

  • 似乎合法。我试试看。
猜你喜欢
  • 2015-08-07
  • 1970-01-01
  • 2020-03-21
  • 2013-04-24
  • 2020-06-18
  • 1970-01-01
  • 2014-05-08
  • 2021-01-27
  • 1970-01-01
相关资源
最近更新 更多