Расширение на Jörn Eyrich отвечает (повышайте его ответ, если вы продвигаете этот вариант), если у вас нет контроля над вызовами dispatch_async
для ваших блоков, как это может быть в случае блоков завершения асинхронизации, вы можете использовать GCD группы, использующие dispatch_group_enter
и dispatch_group_leave
.
В этом примере мы притворяемся, что computeInBackground
- это то, что мы не можем изменить (представьте, что это обратный вызов делегата, NSURLConnection completeHandler или что-то еще) и таким образом, у нас нет доступа к вызовам отправки.
// create a group
dispatch_group_t group = dispatch_group_create();
// pair a dispatch_group_enter for each dispatch_group_leave
dispatch_group_enter(group); // pair 1 enter
[self computeInBackground:1 completion:^{
NSLog(@"1 done");
dispatch_group_leave(group); // pair 1 leave
}];
// again... (and again...)
dispatch_group_enter(group); // pair 2 enter
[self computeInBackground:2 completion:^{
NSLog(@"2 done");
dispatch_group_leave(group); // pair 2 leave
}];
// Next, setup the code to execute after all the paired enter/leave calls.
//
// Option 1: Get a notification on a block that will be scheduled on the specified queue:
dispatch_group_notify(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
NSLog(@"finally!");
});
// Option 2: Block an wait for the calls to complete in code already running
// (as cbartel points out, be careful with running this on the main/UI queue!):
//
// dispatch_group_wait(group, DISPATCH_TIME_FOREVER); // blocks current thread
// NSLog(@"finally!");
В этом примере computeInBackground: завершение: реализовано как:
- (void)computeInBackground:(int)no completion:(void (^)(void))block {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
NSLog(@"%d starting", no);
sleep(no*2);
block();
});
}
Выход (с отметками времени от run):
12:57:02.574 2 starting
12:57:02.574 1 starting
12:57:04.590 1 done
12:57:06.590 2 done
12:57:06.591 finally!
Я подозреваю, или один или несколько символов не соответствуют целевой кодовой странице часть ошибки.
Если вы удалите строки со значениями в этом столбце, он загрузится? Другими словами, можете ли вы определить строки, которые вызывают сбой пакета? Возможно, данные слишком длинные, или может быть какой-то странный символ, который не нравится SQL Server.
Одной из возможных причин этой ошибки является то, что ваш символ-разделитель (запятая, точка с запятой, вертикальная черта и т. д.) на самом деле появляется в данных в одном столбце. Это может привести к очень вводящим в заблуждение сообщениям об ошибках, часто с именем совершенно другого столбца.
Один из способов проверить это — перенаправить «плохие» строки в отдельный файл, а затем проверить их вручную. Вот краткое объяснение того, как это сделать:
http://redmondmag.com/articles/2010/04/12/log-error-rows-ssis.aspx
Если это действительно ваша проблема, то лучшее решение - исправить файлы в источнике, чтобы указать значения данных и/или использовать другой разделитель, которого нет в данных.