module Gio::AsyncInitable
Overview
GAsyncInitable
is an interface for asynchronously initializable objects.
This is the asynchronous version of Gio::Initable
; it behaves the same
in all ways except that initialization is asynchronous. For more details
see the descriptions on GInitable
.
A class may implement both the GInitable
and GAsyncInitable
interfaces.
Users of objects implementing this are not intended to use the interface
method directly; instead it will be used automatically in various ways.
For C applications you generally just call Gio::AsyncInitable#new_async
directly, or indirectly via a foo_thing_new_async() wrapper. This will call
Gio::AsyncInitable#init_async
under the covers, calling back with NULL
and a set GError
on failure.
A typical implementation might look something like this:
WARNING ⚠️ The following code is in c ⚠️
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;
}
Direct including types
Defined in:
lib/gi-crystal/src/auto/gio-2.0/async_initable.crConstructors
-
.cast(obj : GObject::Object) : self
Cast a
GObject::Object
toself
, throws aTypeCastError
if the cast can't be made.
Class Method Summary
- .cast?(obj : GObject::Object) : self | Nil
- .g_type : UInt64
-
.newv_async(object_type : UInt64, n_parameters : UInt32, parameters : GObject::Parameter, io_priority : Int32, cancellable : Gio::Cancellable | Nil, &callback : Gio::AsyncReadyCallback) : Nil
DEPRECATED
Instance Method Summary
- #init_async(io_priority : Int32, cancellable : Gio::Cancellable | Nil, &callback : Gio::AsyncReadyCallback) : Nil
- #init_finish(res : Gio::AsyncResult) : Bool
- #new_finish(res : Gio::AsyncResult) : GObject::Object
- #to_unsafe
Constructor Detail
Class Method Detail
DEPRECATED