Новый фреймворк Xojo, представленный для поддержки iOS, привносит массу отличных вещей в среду рабочего стола. У нас есть новый http-сокет, который поддерживает HTTP 1.1, новый механизм JSON, который поддерживает строки JSON в словари и из них, и целый ряд других полезных вещей.
Но заставить классические фреймворки и Xojo общаться друг с другом может быть проблемой. Например, допустим, вам нужно преобразовать строку в переменную текстового типа. Как правило, это будет работать нормально — Xojo хранит строки внутри в кодировке UTF8. Но что, если вы хотите преобразовать строковое значение из поля в наборе записей? Это неопределенное ведро байтов, поэтому вам нужно сделать что-то вроде:
Dim t As Text = DefineEncoding(rs.IdxField(1).StringValue, Encodings.UTF8).ToText
Теперь поверьте мне, это становится немного трудоемким после шестого раза. Однако вы можете сделать это намного проще, используя метод расширения.
Function ToUTF8Text(Extends s As String) As Text Return DefineEncoding(s, Encodings.UTF8).ToText End Function
Добавьте эту функцию в модуль, и теперь вы можете использовать
Dim t As Text = rs.IdxField(1).StringValue.ToUTF8Text
С чем, я уверен, вы согласитесь, работы намного меньше.
Как насчет отправки набора записей базы данных из одного приложения в другое? Строка данных JSON — очевидный маршрут, и он снова оказывается довольно простым. Используя классическую структуру, я создаю строку JSON для отправки, используя:
Dim rs As RecordSet = db.SQLSelect(sql) If Not (rs Is Nil) Then Dim j As New JSONItem s = “{“”Recordset””:[“ ‘ Classic Framework doesn’t support a dictionary of dictionaries, so we’ll make our own array Dim c As String = “” Do Until rs.EOF // Build a dictionary for this record Dim d As New Dictionary For i = 1 to rs.FieldCount d.Value(rs.IdxField(i).Name) = rs.IdxField(i).Value Next // Convert it to a jsonitem j = d // Append it to the array s = s + c + j.ToString c = “,” rs.MoveNext Loop s = s + “]}” me.Write(s) ‘ Write the result to the TCPSocket End If
Где sql — стандартный оператор SQL Select. Вы можете видеть, что построение этой строки JSON не требует знания данных, поэтому ее можно использовать в любом запросе. Здесь я использую классический фреймворк, потому что фреймворк Xojo требует преобразования строк в текст, и я хочу, чтобы сервер не знал о типах данных.
На принимающей стороне я использую инфраструктуру Xojo для преобразования строки в словарь словарей:
Dim txtData As Text txtData = s.ToUTF8Test Dim dctRoot As xojo.Core.Dictionary dctRoot = xojo.Data.ParseJSON(txtData)
dctRoot теперь представляет собой Xojo.Core.Dictionary, который содержит массив записей, каждая из которых имеет формат словаря. На этом этапе я могу использовать строго типизированный класс ORM для локального хранения данных. Строковые типы данных теперь являются текстовыми типами данных и закодированы. Этот код также будет работать на устройстве iOS, поэтому теперь вы можете перенести набор записей с сервера MySQL/MSSQL/Postgres в свое приложение iOS. Безболезненно!
Еще одна замечательная особенность фреймворка Xojo — Timer.Calllater. Это абсолютно необходимо при работе с механизмом состояний. Допустим, вы хотите опубликовать клиента в облачном сервисе, после успешного ответа вы теперь хотите опубликовать три адреса, а после этого четыре контакта. Каждое из этих сообщений требует успешного предыдущего сообщения, и если оно запущено из события доступности данных HTTPSocket (что невозможно в среде Xojo), вы получите несколько уровней стека. Calllater помещает ваш следующий пост в цикл событий, который усекает стек в этой точке. Делайте это правильно, и вы больше никогда не увидите переполнения стека.
Так что, пока фреймворк Xojo не станет многофункциональным, нетрудно заставить эти фреймворки хорошо работать вместе, используя сильные стороны обоих.