接口
GioAsyncInitable
自:2.22
描述 [src]
interface Gio.AsyncInitable : GObject.Object
GAsyncInitable
是一个用于异步初始化对象的接口。
这是 GInitable
的异步版本;在所有方面都表现相同,除了初始化是异步的。更多详细信息,请参阅 GInitable
的描述。
一个类可以同时实现 GInitable
和 GAsyncInitable
接口。
使用实现此接口的对象的用户不打算直接使用接口方法;相反,它将以各种方式自动使用。对于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_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
接口结构
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 |
|
父接口。 |
|
init_async |
|
启动对象的初始化。 |
|
init_finish |
|
完成对象的初始化。 |
虚函数
Gio.AsyncInitable.init_async
开始实现接口的生成对象的异步初始化。必须在首次构造后的真实使用之前执行此操作。如果对象还实现了 GInitable
,你可以选择调用 g_initable_init()
。
自:2.22