Jint.Ex is event-driven interaction run time for Jint to build non blocking UI and creating asynchronous API.
In this example, I ported the WinForm app described in Jint tutorial 006 - Using Jint and Jint.Ex in a Win Form Application to an iOS application using the Xamarin stack.
For this sample, I used the MonoTouch Dialog library to build the UI.
The overall C# code is the same which is the point of Jint.Ex all the JavaScript execution including callback event are executed in a background thread by Jint.Ex AsyncronousEngine and interact with the UI.
C#
namespace Jint.Ex.iOS { [Register("AppDelegate")] public partial class AppDelegate : UIApplicationDelegate { UINavigationController navigation; UIWindow window; private AsyncronousEngine _asyncronousEngine; private Section _outputSection; private void InitAsyncronousEngine() { _asyncronousEngine = new AsyncronousEngine(); _asyncronousEngine.EmbedScriptAssemblies.Add(Assembly.GetExecutingAssembly()); // Expose to the JavaScript the function setUserMessage which add a string in the Listbox _asyncronousEngine.Engine.SetValue("setUserMessage", new Action<string>(__setUserMessage__)); } private void __setUserMessage__(string s) { InvokeOnMainThread (delegate { _outputSection.Insert (0, UITableViewRowAnimation.None, new StringElement (s)); }); } public void SynchronousExecution() { _asyncronousEngine.RequestFileExecution("SynchronousExecution.js"); } public void AsynchronousExecution() { _asyncronousEngine.RequestFileExecution("AsynchronousExecution.js"); } public void Timer() { _asyncronousEngine.RequestFileExecution("Timer.js"); } public void MultipleTimers() { _asyncronousEngine.RequestFileExecution("MultipleTimers.js"); } public void ClearOuput() { _outputSection.RemoveRange(0, _outputSection.Elements.Count); } public void ClearEventQueue() { ClearOuput(); _asyncronousEngine.RequestClearQueue(); } public override bool FinishedLaunching(UIApplication app, NSDictionary options) { InitAsyncronousEngine(); _outputSection = new Section("Output") { }; var menu = new RootElement ("Jint and Jint.Ex iOS Demo") { new Section ("Menu"){ new StringElement ("Synchronous Execution", SynchronousExecution), new StringElement ("Asynchronous Execution", AsynchronousExecution), new StringElement ("Timer", Timer), new StringElement ("Multiple Timer", MultipleTimers), new StringElement ("Clear Output", ClearOuput), new StringElement ("Clear Event Queue", ClearEventQueue), }, _outputSection }; var dv = new DialogViewController (menu) { Autorotate = true }; navigation = new UINavigationController (); navigation.PushViewController (dv, true); // On iOS5 we use the new window.RootViewController, on older versions, we add the subview window = new UIWindow (UIScreen.MainScreen.Bounds); window.MakeKeyAndVisible (); if (UIDevice.CurrentDevice.CheckSystemVersion (5, 0)) window.RootViewController = navigation; else window.AddSubview (navigation.View); return true; } } }
No comments:
Post a Comment