7 #import "flutter/fml/trace_event.h"
8 #import "flutter/lib/ui/window/platform_message.h"
15 @property(nonatomic, strong) dispatch_queue_t
queue;
19 - (instancetype)init {
22 _queue = dispatch_queue_create(
"FLTSerialTaskQueue", DISPATCH_QUEUE_SERIAL);
28 dispatch_release(_queue);
32 - (void)dispatch:(dispatch_block_t)block {
33 dispatch_async(
self.
queue, block);
39 NSObject<FlutterTaskQueue>* PlatformMessageHandlerIos::MakeBackgroundTaskQueue() {
43 PlatformMessageHandlerIos::PlatformMessageHandlerIos(
44 fml::RefPtr<fml::TaskRunner> platform_task_runner)
45 : platform_task_runner_(std::move(platform_task_runner)) {}
50 fml::RefPtr<flutter::PlatformMessageResponse> completer = message->response();
56 std::lock_guard lock(message_handlers_mutex_);
57 auto it = message_handlers_.find(message->channel());
58 if (it != message_handlers_.end()) {
59 handler_info = it->second;
65 if (message->hasData()) {
70 TRACE_EVENT_ASYNC_BEGIN1(
"flutter",
"PlatformChannel ScheduleHandler", platform_message_id,
71 "channel", message->channel().c_str());
72 dispatch_block_t run_handler = ^{
73 handler(data, ^(NSData* reply) {
74 TRACE_EVENT_ASYNC_END0(
"flutter",
"PlatformChannel ScheduleHandler", platform_message_id);
80 completer->CompleteEmpty();
87 [handler_info.task_queue.get() dispatch:run_handler];
89 dispatch_async(dispatch_get_main_queue(), run_handler);
93 completer->CompleteEmpty();
105 std::unique_ptr<fml::Mapping> mapping) {
119 NSObject<FlutterTaskQueue>* task_queue) {
120 FML_CHECK(platform_task_runner_->RunsTasksOnCurrentThread());
124 FML_CHECK(!task_queue || [task_queue respondsToSelector:
@selector(dispatch:)]);
126 std::lock_guard lock(message_handlers_mutex_);
127 message_handlers_.erase(channel);
129 message_handlers_[channel] = {
130 .task_queue = fml::scoped_nsprotocol(
131 [
static_cast<NSObject<FlutterTaskQueueDispatch>*
>(task_queue) retain]),
133 fml::ScopedBlock<FlutterBinaryMessageHandler>{
134 handler, fml::scoped_policy::OwnershipPolicy::kRetain},