Для цикла с фоновым циклом, с завершением?

Я хочу запустить for loop с фоновым кодом, что-то происходит, когда он завершает итерацию по каждому элементу. Сделать это без фонового кода было бы просто, вот так:

for aString: String in strings {
    if string.utf8Length < 4 {
        continue
    }

    //Some background stuff
}

//Something to do upon completion

Но включение туда фонового кода означает, что код, выполняемый после завершения, выполняется до того, как будут обработаны все элементы.

for aString: String in strings {
    if string.utf8Length < 4 {
        continue
    }

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)) {
        //Some background stuff
    }
}

//Something to do upon completion

Мне интересно, возможно ли это сделать.

1 ответ

Решение

Рассмотрите возможность использования группы рассылки. Это обеспечивает механизм, который уведомляет вас о завершении отправленных задач. Так что вместо dispatch_asyncиспользовать dispatch_group_async:

let group = dispatch_group_create();

for aString: String in strings {
    if aString.utf8Length >= 4 {
        dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)) {
            //Some background stuff
        }
    }
}

dispatch_group_notify(group, dispatch_get_main_queue()) {
    // whatever you want when everything is done
}

К вашему сведению, здесь приведено представление той же идеи в очереди операций (хотя и ограничивающее количество одновременных операций).

let queue = NSOperationQueue()
queue.name = "String processing queue"
queue.maxConcurrentOperationCount = 12

let completionOperation = NSBlockOperation() {
    // what I'll do when everything is done
}

for aString: String in strings {
    if aString.utf8Length >= 4 {
        let operation = NSBlockOperation() {
            // some background stuff
        }
        completionOperation.addDependency(operation)
        queue.addOperation(operation)
    }
}

queue.addOperation(completionOperation)
Другие вопросы по тегам