Моя библиотека предоставляет 2 API, по следующим адресам:Принудительный порядок исполнения с использованием dispatch_sync
-(void) createFile{
dispatch_sync(queueSerial, ^{ //B1
[fileObj createFileInfo:file completion:^(NSError *error){
//execute completion block C1
}];
});
}
-(void) readFile:(NSData*)timeStamp{
dispatch_async(queueSerial, ^{ //B2
[fileObj readFileInfo:fileName completion:^(NSError *error) {
dispatch_async(queueSerial2, ^{
//execute completion block C2
});
}]
});
}
Оба readFile
и createFile
асинхронные методы.
Обычно я рекомендую людям, с помощью моей библиотеки позвонить по телефону createFile
до readFile
. Тем не менее, нет гарантии, что вызывающие абоненты в конечном итоге смогут это реализовать. Это, как правило, получает вызывается следующим образом (и я не имею никакого контроля над этим)
[fileClass createFile];
[fileClass readFile:timeStamp];
То, что я хочу сделать, это обеспечить readFile
вызывается после того, как completion block C1
выполняется. Я также не хочу блокировать основной поток createFile
(но это ожидание можно смягчить). Так что я хочу достичь, как конечный результат:
- Caller (что я не имею никакого контроля над) вызывает
createFile
и сразу после звонковreadFile
createFile
полностью выполняет, блок завершенияC1
увольняют и после что,readFile
отправлен, чтобы сделать это.
Как я могу это достичь?
@Rob спасибо за понимание.В настоящий момент я являюсь полным молодым (в Obj C), поэтому я буду стараться следовать вашему предложению впредь. – ExceptionHandler
Как 'readFile' передает данные, которые он читает? Он определен как return 'void', поэтому он должен использовать обработчик завершения или шаблон делегирования? – Rob
@Rob 'readFile' передает данные (значение ошибки, если они есть) в обработчик завершения C2. Я не был уверен, были ли эти части релевантными. – ExceptionHandler