2017-09-13 7 views
3

je tente de faire une application iOS avec iOS.Xamarin. J'ai aussi un serveur où j'envoie des événements à mon application avec des websockets. Mais les fonctions websockets sont dans un autre projet.conception événementielle dans une solution de projets multiples

Donc, si le serveur envoie un nouvel événement, je veux dire au projet iOS qui est arrivé un nouvel événement. Je ne peux pas le retourner parce que je ne peux pas référencer les deux projets les uns aux autres.

Comment puis-je mettre en œuvre un événement pour la conception axée sur plusieurs projets dans une solution?

Voici mon code actuel:

iOS projet

public partial class LobbyViewController : UIViewController 
{ 


    public LobbyViewController (IntPtr handle) : base (handle) 
    { 
    } 

    public override void ViewDidLoad() 
    { 
     base.ViewDidLoad();     
    } 

    public void changePage() 
    { 
     UIViewController introViewController = Storyboard.InstantiateViewController("IntroViewController") as IntroViewController; 
     introViewController.ModalTransitionStyle = UIModalTransitionStyle.CoverVertical; 
     PresentViewController(introViewController, true, null); 
    } 
} 

Projet général (où arriver mes événements)

public static class Sockets 
{ 
    public static Socket socket; 
    static bool isConnected = false; 

    public static void Main(string token) 
    { 
     socket = connect(token); 
    } 

    private static Socket connect(string Token) 
    { 
     var options = new IO.Options(); 
     options.Query = new Dictionary<string, string>() 
     { 
      { "token", Token } 
     }; 

     var socket = IO.Socket(Resource.SocketsUrl, options); 

     socket.On(Socket.EVENT_CONNECT,() => 
     { 
      isConnected = true; 
     }); 

     socket.On(Socket.EVENT_ERROR, (error) => 
     { 
      appendLogMessage("ERROR! " + error.ToString(), true); 
     }); 

     socket.On(Socket.EVENT_DISCONNECT, (data) => 
     { 
      isConnected = false; 
      appendLogMessage("Disconected"); 
     }); 

     socket.On(Socket.EVENT_MESSAGE, (data) => 
     { 
      appendLogMessage(data.ToString(), true); 
     }); 

     socket.On("lobbyParticipantAdded", (data) => 
     { 
      appendLogMessage(data.ToString(), true); 
     }); 

     socket.On("lobbyFlowStart", (data) => 
     { 
      appendLogMessage(data.ToString(), true); 
     }); 

     socket.On("quizQuestion", (data) => 
     { 
      appendLogMessage(data.ToString(), true); 
     }); 

     socket.On("gameEnd", (data) => 
     { 
      appendLogMessage(data.ToString(), true); 
     }); 

     return socket; 
    } 
} 
+0

Vous pouvez essayer envoyer une notification push à l'application iOS lorsque la socket est envoyé. –

Répondre

1

J'ai trouvé une solution pour mon problème. .. Je créer une nouvelle classe où je peux tirer mes résultats à l'autre projet ... Tout d'abord, vous devriez ajouter à votre projet principal:

SocketsEventHandler.Add("eventname", callback); 

Ce module nom_événement au Dictionary dans le SocketsEventHandlerClass.

Le SocketsEventHandlerClass ressemblera à ceci:

public class SocketEventHandler 
{ 
    static SocketEventHandler() 
    { 
     callbackList = new Dictionary<string, List<Action<dynamic>>>(); 
    } 

    public static Dictionary<string, List<Action<dynamic>>> callbackList; 

    public static void Add(string eventName, Action<dynamic> callback) 
    { 
     if (callbackList.ContainsKey(eventName)) 
     { 
      callbackList[eventName].Add(callback); 
     } 
     else 
     { 
      callbackList.Add(eventName, new List<Action<dynamic>> { callback }); 
     } 
    } 

    public static void Fire(string eventName, dynamic payload) 
    { 
     try 
     { 
      List<Action<dynamic>> actions = callbackList[eventName]; 

      foreach (var item in actions) 
      { 
       item(payload); 
      } 
     } 
     catch (Exception e) { } 
    } 

Et quand vous voulez tirer quelque chose au projet principal, vous pouvez simplement dire:

SocketEventHandler.Fire("eventname", payload); 

J'espère que cela aide d'autres!

Edit:
Je viens de créer un git avec un exemple:

MultiProjectEventHandler

Enyoj it!