Новый фреймворк 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 не станет многофункциональным, нетрудно заставить эти фреймворки хорошо работать вместе, используя сильные стороны обоих.