Долго опрос с NSURLConnection

JSON (Объектная нотация JavaScript) является легким форматом, который используется для обмена данных. Это основано на подмножестве языка сценариев JavaScript (способ, которым объекты создаются в JavaScript). Как [1 112] указанный в MDN, некоторый JavaScript не является JSON, и некоторым JSON не является JavaScript.

примером того, где это используется, являются ответы веб-сервисов. В 'старые' дни веб-сервисы использовали XML в качестве своего формата первичных данных для передачи назад данных, но так как JSON появился (, формат JSON определяется в [1 113] RFC 4627 Douglas Crockford ), это был предпочтительный формат, потому что это - намного больше легкий вес

, можно найти намного больше информации о чиновнике веб-сайт JSON .

JSON основан на двух структурах:

  • набор А пар имя/значение. На различных языках это понято как объект, запись, структура, словарь, хэш-таблица, включенный список или ассоциативный массив.
  • заказанный список значений. На большинстве языков это понято как массив, вектор, список или последовательность.

Структура JSON



JSON Object diagram

JSON Array diagram

JSON Value diagram

JSON String diagram

JSON Number diagram

Вот пример данных JSON:

{
     "firstName": "John",
     "lastName": "Smith",
     "address": {
         "streetAddress": "21 2nd Street",
         "city": "New York",
         "state": "NY",
         "postalCode": 10021
     },
     "phoneNumbers": [
         "212 555-1234",
         "646 555-4567"
     ]
 }

JSON в JavaScript

JSON (в JavaScript) является строкой!

Люди часто предполагают, что все объекты JavaScript являются JSON и что JSON является объектом JavaScript. Это неправильно.

В Javascript var x = {x:y} не JSON, это объект JavaScript . Эти два не являются тем же самым. Эквивалент JSON (представленный на языке сценариев JavaScript) был бы var x = '{"x":"y"}'. x объект строки типа не объект в своем собственном праве. Для превращения это в полностью оперенный JavaScript возражает, что необходимо сначала проанализировать его, var x = JSON.parse('{"x":"y"}');, x теперь объект, но это больше не JSON.

Видят объект JavaScript По сравнению с JSON

При работе с JSON и JavaScript, можно испытать желание использовать эти eval функция для оценки результата, возвращенного в обратном вызове, но это не предлагается, так как существует два символа (U+2028 & U+2029) допустимый в JSON, но не в JavaScript (читает больше из этого здесь ).

Поэтому нужно всегда пытаться использовать сценарий Crockford, который проверяет на допустимый JSON прежде, чем оценить его. Свяжитесь с объяснением сценария, найден здесь и здесь прямая ссылка в js файл. Каждый главный браузер в наше время имеет его собственная реализация для этого.

Пример о том, как использовать синтаксический анализатор JSON (с json от вышеупомянутого фрагмента кода):

//The callback function that will be executed once data is received from the server
var callback = function (result) {
    var johnny = JSON.parse(result);
    //Now, the variable 'johnny' is an object that contains all of the properties 
    //from the above code snippet (the json example)
    alert(johnny.firstName + ' ' + johnny.lastName); //Will alert 'John Smith'
};

синтаксический анализатор JSON также предлагает другой очень полезный метод, stringify. Этот метод принимает объект JavaScript в качестве параметра, и выводы поддерживают строку форматом JSON. Это полезно для того, когда Вы хотите к [1 149], передают данные обратно серверу:

var anObject = {name: "Andreas", surname : "Grech", age : 20};
var jsonFormat = JSON.stringify(anObject);
//The above method will output this: {"name":"Andreas","surname":"Grech","age":20}

вышеупомянутые два метода (parse и stringify) также берут второй параметр, который является функцией, которая будет вызвана для каждого ключа и значения на каждом уровне конечного результата, и каждое значение будет заменено результатом Вашей введенной функции. (Больше на этом здесь )

Btw, для всех Вас там, кто думает, JSON только для JavaScript, проверьте это сообщение , который объясняет и подтверждает иначе.

Ссылки

14
задан Varun Kumar 9 January 2017 в 15:05
поделиться

5 ответов

NSURLConnection will buffer the data while it is downloading and give it all back to you in one chunk with the didReceiveData method. The NSURLConnection class can't tell the difference between network lag and an intentional split in the data.

You would either need to use a lower-level network API like CFSocket as you mention (you would have access to each byte as it comes in from the network interface, and could distinguish the two parts of your payload), or you could take a look at a library like CURL and see what types of output buffering/non-buffering there is there.

7
ответ дан 1 December 2019 в 15:12
поделиться

Похоже, вам нужно промыть сокет на стороне сервера, хотя это действительно сложно сказать наверняка. Если вы не можете легко изменить сервер для этого, то может помочь обнюхивание сетевого соединения, чтобы увидеть, когда что-то на самом деле отправляется с сервера.

Вы можете использовать такой инструмент, как Wireshark, для прослушивания вашей сети.

Другой вариант просмотра того, что отправлено / получено на / от телефона, описан в следующей статье:

http://blog.jerodsanto.net/2009/06/sniff-your-iphones-network-traffic /

Удачи!

0
ответ дан 1 December 2019 в 15:12
поделиться

В настоящее время мы проводим некоторые исследования и разработки для переноса наших библиотек комет StreamLink на iPhone.

Я обнаружил, что в эмуляторе вы начнете получать обратные вызовы didReceiveData после получения 1 КБ данных. Таким образом, вы можете отправить блок нежелательной почты размером 1 КБ, чтобы начать получать обратные вызовы. Похоже, что на устройстве этого не происходит. В сафари (на устройстве) вам нужно отправить 2 КБ, но с помощью NSURLConnection я тоже не получаю обратных вызовов. Похоже, мне, возможно, придется применить тот же подход.

Я мог бы также поиграть с multipart-replace и некоторыми другими более новыми заголовками и типами mime, чтобы увидеть, помогает ли это стимулировать NSURLConnection.

0
ответ дан 1 December 2019 в 15:12
поделиться

Я столкнулся с этим сегодня. Я написал свой собственный класс, чтобы справиться с этим, который имитирует базовую функциональность NSURLConnection.

http://github.com/nall/SZUtilities/blob/master/SZURLConnection.h

3
ответ дан 1 December 2019 в 15:12
поделиться

Существует другая реализация HTTP API под названием ASIHttpRequest. Она не имеет вышеуказанной проблемы и предоставляет полный набор инструментов для почти всех функций HTTP, включая загрузку файлов, Cookies, аутентификацию, ...

http://allseeing-i.com/ASIHTTPRequest/

0
ответ дан 1 December 2019 в 15:12
поделиться