接口

GioAsyncInitable

自:2.22

描述 [src]

interface Gio.AsyncInitable : GObject.Object

GAsyncInitable 是一个用于异步初始化对象的接口。

这是 GInitable 的异步版本;在所有方面都表现相同,除了初始化是异步的。更多详细信息,请参阅 GInitable 的描述。

一个类可以同时实现 GInitableGAsyncInitable 接口。

使用实现此接口的对象的用户不打算直接使用接口方法;相反,它将以各种方式自动使用。对于C应用程序,你通常直接调用 g_async_initable_new_async(),或者通过一个 foo_thing_new_async() 包装器间接调用。在幕后,这将调用 g_async_initable_init_async(),在失败时回调用 NULL 和设置了一个 GError

一个典型的实现可能看起来像这样

enum {
   NOT_INITIALIZED,
   INITIALIZING,
   INITIALIZED
};

static void
_foo_ready_cb (Foo *self)
{
  GList *l;

  self->priv->state = INITIALIZED;

  for (l = self->priv->init_results; l != NULL; l = l->next)
    {
      GTask *task = l->data;

      if (self->priv->success)
        g_task_return_boolean (task, TRUE);
      else
        g_task_return_new_error (task, ...);
      g_object_unref (task);
    }

  g_list_free (self->priv->init_results);
  self->priv->init_results = NULL;
}

static void
foo_init_async (GAsyncInitable       *initable,
                int                   io_priority,
                GCancellable         *cancellable,
                GAsyncReadyCallback   callback,
                gpointer              user_data)
{
  Foo *self = FOO (initable);
  GTask *task;

  task = g_task_new (initable, cancellable, callback, user_data);
  g_task_set_name (task, G_STRFUNC);

  switch (self->priv->state)
    {
      case NOT_INITIALIZED:
        _foo_get_ready (self);
        self->priv->init_results = g_list_append (self->priv->init_results,
                                                  task);
        self->priv->state = INITIALIZING;
        break;
      case INITIALIZING:
        self->priv->init_results = g_list_append (self->priv->init_results,
                                                  task);
        break;
      case INITIALIZED:
        if (!self->priv->success)
          g_task_return_new_error (task, ...);
        else
          g_task_return_boolean (task, TRUE);
        g_object_unref (task);
        break;
    }
}

static gboolean
foo_init_finish (GAsyncInitable       *initable,
                 GAsyncResult         *result,
                 GError              **error)
{
  g_return_val_if_fail (g_task_is_valid (result, initable), FALSE);

  return g_task_propagate_boolean (G_TASK (result), error);
}

static void
foo_async_initable_iface_init (gpointer g_iface,
                               gpointer data)
{
  GAsyncInitableIface *iface = g_iface;

  iface->init_async = foo_init_async;
  iface->init_finish = foo_init_finish;
}

自从:2.22

先决条件

为了实现 AsyncInitable,你的类型必须继承自 GObject

函数

g_async_initable_new_async

用于构建 GAsyncInitable 对象的辅助函数。这类似于 g_object_new(),但还异步初始化对象。

自:2.22

g_async_initable_new_valist_async

用于构建 GAsyncInitable 对象的辅助函数。这类似于 g_object_new_valist(),但还异步初始化对象。

自:2.22

g_async_initable_newv_async

用于构建 GAsyncInitable 对象的辅助函数。这类似于 g_object_newv(),但还异步初始化对象。

已弃用:2.54 自从:2.22

实例方法

g_async_initable_init_async

开始实现接口的生成对象的异步初始化。必须在首次构造后的真实使用之前执行此操作。如果对象还实现了 GInitable,你可以选择调用 g_initable_init()

自:2.22

g_async_initable_init_finish

完成异步初始化并返回结果。请参阅 g_async_initable_init_async()。

自:2.22

g_async_initable_new_finish

完成多种 g_async_initable_new 调用的异步构造,返回创建的对象或错误返回 NULL

自:2.22

接口结构

struct GioAsyncInitableIface {
  GTypeInterface g_iface;
  void (* init_async) (
    GAsyncInitable* initable,
    int io_priority,
    GCancellable* cancellable,
    GAsyncReadyCallback callback,
    gpointer user_data
  );
  gboolean (* init_finish) (
    GAsyncInitable* initable,
    GAsyncResult* res,
    GError** error
  );
  
}

提供一个异步初始化对象的接口,以便初始化可能会失败。

接口成员
g_iface
GTypeInterface
 

父接口。

init_async
void (* init_async) (
    GAsyncInitable* initable,
    int io_priority,
    GCancellable* cancellable,
    GAsyncReadyCallback callback,
    gpointer user_data
  )
 

启动对象的初始化。

init_finish
gboolean (* init_finish) (
    GAsyncInitable* initable,
    GAsyncResult* res,
    GError** error
  )
 

完成对象的初始化。

虚函数

Gio.AsyncInitable.init_async

开始实现接口的生成对象的异步初始化。必须在首次构造后的真实使用之前执行此操作。如果对象还实现了 GInitable,你可以选择调用 g_initable_init()

自:2.22

Gio.AsyncInitable.init_finish

完成异步初始化并返回结果。请参阅 g_async_initable_init_async()。

自:2.22