2017-09-13 97 views
3

我尝试使用iOS.Xamarin执行iOS应用程序。我也有一个服务器,我用websockets将事件发送到我的应用程序。但是websockets函数在另一个项目中。多项目解决方案中的事件驱动设计

因此,如果服务器发送新事件,我想告诉iOS项目新事件已到达。我无法返回它,因为我无法将两个项目互相引用。

如何在一个解决方案中为多个项目实现事件驱动设计?

这里是我当前的代码:

的iOS项目

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); 
    } 
} 

一般项目(在我的事件到达)

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

您可以尝试在发送套接字时向iOS应用程序发送推送通知。 –

回答

1

我发现我的问题的解决方案。 ..我创建了一个新课程,我可以将我的结果发回其他项目...首先,您应该添加到您的主要项目:

SocketsEventHandler.Add("eventname", callback); 

此添加事件名称到Dictionary在SocketsEventHandlerClass。

的SocketsEventHandlerClass看起来就像这样:

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) { } 
    } 

而当你想火的东西,主要项目上,你可以简单地说:

SocketEventHandler.Fire("eventname", payload); 

我希望这可以帮助一些人!

编辑:
我只是创建一个实例的混帐回购协议:

MultiProjectEventHandler

Enyoj吧!