Help us understand the problem. What is going on with this article?

【NCMB】 ニフティクラウド mobile backend の会員登録/ログインをIObservable化してUniRxで扱えるようにする

More than 3 years have passed since last update.

UniRxについての記事のまとめはこちら


niftyのmBaaSであるニフティクラウド mobile backend(NCMB)のログイン周りの処理をObservableに変換し、UniRxで扱えるようにしてみました。

IObservable化したコード

static classとして定義してあります。利用時にusingして下さい。
あと、ついでに使いやすいように会員登録時に別フィールドも更新できる機能を追加しました。

ログイン処理をIObservableに変換する
using System.Collections.Generic;
using NCMB;
using UniRx;

namespace ObservableNcmb
{
    public static class ObservableNcmbUserAuth
    {
        /// <summary>
        /// IDとパスワードによるログインを実行する
        /// </summary>
        public static IObservable<NCMBUser> LoginAsync(string id, string password)
        {
            return Observable.Create<NCMBUser>(observer =>
            {
                NCMBUser.LogInAsync(id, password, e =>
                {
                    if (e == null)
                    {
                        observer.OnNext(NCMBUser.CurrentUser);
                        observer.OnCompleted();
                    }
                    else
                    {
                        observer.OnError(e);
                    }
                });
                return Disposable.Create(() => {; });
            });
        }

        /// <summary>
        /// IDとパスワードによる会員登録を実行する
        /// </summary>
        /// <param name="id">ID</param>
        /// <param name="password">パスワード</param>
        /// <param name="optionalData">その他フィールド</param>
        /// <returns></returns>
        public static IObservable<NCMBUser> SingUpAsync(
            string id,
            string password,
            Dictionary<string, object> optionalData = null)
        {
            return SingUpAsync(id: id, password: password, optionalData: optionalData, mail: null);
        }


        /// <summary>
        /// IDおよびメールアドレスとパスワードによる会員登録を実行する
        /// </summary>
        /// <param name="mail">メールアドレス</param>
        /// <param name="id">ID</param>
        /// <param name="password">パスワード</param>
        /// <param name="optionalData">その他フィールド</param>
        /// <returns></returns>
        public static IObservable<NCMBUser> SingUpAsync(
            string mail,
            string id,
            string password,
            Dictionary<string, object> optionalData = null)
        {
            return Observable.Create<NCMBUser>(observer =>
            {
                var user = new NCMBUser
                {
                    Email = mail,
                    UserName = id,
                    Password = password
                };

                if (optionalData != null)
                {
                    foreach (var opt in optionalData)
                    {
                        user[opt.Key] = opt.Value;
                    }
                }

                user.SignUpAsync(e =>
                {
                    if (e == null)
                    {
                        observer.OnNext(user);
                        observer.OnCompleted();
                    }
                    else
                    {
                        observer.OnError(e);
                    }
                });
                return Disposable.Create(() => {; });
            });
        }

        /// <summary>
        /// ログアウトを行う
        /// </summary>
        public static IObservable<Unit> LogoutAsync()
        {
            return Observable.Create<Unit>(observer =>
            {
                NCMBUser.LogOutAsync(e =>
                {
                    if (e == null)
                    {
                        observer.OnNext(Unit.Default);
                        observer.OnCompleted();
                    }
                    else
                    {
                        observer.OnError(e);
                    }
                });
                return Disposable.Create(() => {; });
            });
        }
    }
}

使用例

実際に今開発してるプロダクトからコードを抜粋してみました。
ユーザ登録時にプレイヤ名(ScreenName)も一緒に登録するというコードです。

ユーザの新規登録
/// <summary>
/// ユーザの新規登録を行う
/// </summary>
public void SignUp(string id, string mail, string pass, string screenName)
{
    //プレイヤの表示名を登録時に設定する
    //会員テーブルに予めフィールドを増やしておく必要がある
    var optionalData = new Dictionary<string, object>()
    {
        {"screenName",screenName }
    };

    //ユーザの新規登録
    ObservableNcmbUserAuth
        .SingUpAsync(mail, id, pass, optionalData)
        .Subscribe(user =>
        {
            //NCMBUserインスタンスを保存
            UserProfileProvider.SetUser(user);
            //ログイン成功通知
            onSuccessLoginSubject.OnNext(Unit.Default);
        },
        //エラー時はエラーメッセージにを通知
        ex => failedReasonSubject.OnNext(ConvertExceptionToText((NCMBException)ex)));

}

実行するとこのように基本情報に合わせてscreenNameフィールドも設定されます
s.png

非同期処理やコールバック関数を実行するものはIObservableに変換してしまい、全てUniRxの世界で扱えるようにしておくととても捗るのでおすすめです。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away