#ios #delphi #firemonkey
#iOS #delphi #firemonkey
Вопрос:
У меня возникли проблемы с переводом в delphi функции, приведенной ниже
- (BOOL)registerForTaskWithIdentifier:(NSString *)identifier
usingQueue:(dispatch_queue_t)queue
launchHandler:(void (^)(__kindof BGTask *task))launchHandler;
и это пример использования :
BGTaskScheduler.shared.register(forTaskWithIdentifier: 'toto', using: nil) { (task) in
task.expirationHandler = {
task.setTaskCompleted(success: false)
}
}
Это обсуждение delphi, которое я сделал из заголовка :
BGTaskScheduler = interface(NSObject)
function registerForTaskWithIdentifier(identifier: NSString; usingQueue: dispatch_queue_t; launchHandler: TBackgroundTasksLaunchHandler) : Boolean; cdecl;
end;
BGTask = interface(NSObject)
procedure setExpirationHandler(expirationHandler: TBackgroundTasksExpirationHandler); cdecl;
end;
Но я не понимаю, как я могу сделать эту часть в delphi :
task.expirationHandler = {
task.setTaskCompleted(success: false)
}
Комментарии:
1. У меня нет никакого опыта работы со Swift, но, основываясь на коде, я бы предположил, что последним показанным вами кодом может быть назначение определенного метода некоторому обработчику событий, чтобы такой метод выполнялся один раз, когда он даже срабатывает. Возможно, я ошибаюсь.
2. @SilverWarior да, я думаю точно так же, как и вы, единственная проблема заключается в том, что, насколько я знаю, у них нет понятия процедуры объекта в интерфейсе Objective c к delphi. Я ошибаюсь?
3. В Delphi сам интерфейс не может хранить какие-либо данные самостоятельно. Таким образом, вы не можете сохранить ссылку на метод объекта, как это делает пример кода. Но при чтении BGTaskScheduler планировщик задач фактически объявляется как класс, а не интерфейс. Теперь, насколько я знаю, для того, чтобы интерфейс мог обращаться к полям класса, для этого необходимо использовать собственные методы класса. Но мои знания о работе с интерфейсами в Delphi довольно просты, поэтому я могу ошибаться
4. наконец, я нашел, что их метод, такой как SetexpirationHandler, может сделать трюк 🙂