定制对象下载管理器

时间:2017-01-19 10:55:01

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

我被困在这里。我有一个自定义类,我创建下载图像。我想要做的是为其中一个方法制作一个完成块。

例如:

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

 //do stuff
}];

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

2 个答案:

答案 0 :(得分:2)

你可以这样做

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) {

    }];

答案 1 :(得分:1)

你绝对可以在其他人中嵌套。

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

- (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秒后打印出来。