获得异步任务完成后的通知

队列中的异步任务完成后,可以用dispatch_group_notify()来获得通知。

执行时,手动触发dispatch_group_enter()和dispatch_group_leave()函数。

用法如下:

 // 创建一个串行队列
    dispatch_queue_t queue = dispatch_queue_create("com.test.queue", DISPATCH_QUEUE_SERIAL);

    // 创建group
    dispatch_group_t group = dispatch_group_create();

    // 异步任务1
    dispatch_async(queue, ^{
        dispatch_group_enter(group);    // 任务开始的时候,需要手动调用这个函数
        NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
        AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];
        NSURL *URL = [NSURL URLWithString:@"http://example.com/download1.zip"];
        NSURLRequest *request = [NSURLRequest requestWithURL:URL];
        NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:request progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
            NSURL *documentsDirectoryURL = [[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:NO error:nil];
            return [documentsDirectoryURL URLByAppendingPathComponent:[response suggestedFilename]];
        } completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
            NSLog(@"File downloaded to: %@", filePath);
            dispatch_group_leave(group); // 异步执行完成后,需要手动调用这个函数
        }];
        [downloadTask resume];
    });

    // 异步任务2
    dispatch_async(queue, ^{
        dispatch_group_enter(group);    // 任务开始的时候,需要手动调用这个函数
        NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
        AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];
        NSURL *URL = [NSURL URLWithString:@"http://example.com/download1.zip"];
        NSURLRequest *request = [NSURLRequest requestWithURL:URL];
        NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:request progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
            NSURL *documentsDirectoryURL = [[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:NO error:nil];
            return [documentsDirectoryURL URLByAppendingPathComponent:[response suggestedFilename]];
        } completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
            NSLog(@"File downloaded to: %@", filePath);
            dispatch_group_leave(group);    // 异步执行完成后,需要手动调用这个函数
        }];
        [downloadTask resume];
    });

    // group通知
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        NSLog(@"全部下载完成!");
    });

你可能感兴趣的:(获得异步任务完成后的通知)