JPAsyncJsonParser Class Reference
| Inherits from | NSObject |
| Declared in | JPAsyncJsonParser.h JPAsyncJsonParser.mm |
Overview
While a JPJsonParser can only parse input which contains one or more JSON
documents that is provided in one buffer which is a contiguous sequence of
bytes in memory, a JPAsyncJsonParser is capable to parse input which is
partitioned into a contiguous set of data buffers. The concatenated content may
comprise one or more JSON documents.
When downloading a resource from the net, the underlaying network layer will
usually provide the content in chunks, each contained in a data buffer. For example,
NSURLConnection delivers the content as a sequence of NSData objects to its delegate.
The sequence of data buffers make up the complete input which may contain one or more
JSON documents.
JPAsyncJsonParser provides an interface where a sequence of NSData buffers can
be sent via the message parseBuffer: to a JPAsyncJsonParser object. This makes
JPAsyncJsonParser especially suited to receive partial input which will be
received as a sequence of data buffers, e.g. from a NSURLConnection delegate or
through a NSStream interface.
A JPAsyncJsonParser instance will invoke the underlaying parser
asynchronously. That is, when an JPAsyncJsonParser instance receives the
start message, the underlaying JSON parser will be executed on a different
thread and the method start returns immediately. The underlaying JSON parser
will then wait for incoming data buffer to become available for parsing.
The client is responsible to provide the sequence of NSData objects which
will be sent by message parserBuffer: to the JPAsyncJsonParser instance.
The underlaying JSON parser in turn will consume this data buffer and start
parsing it. As a result it will send parse events to the semantic actions
object as long as there is data available, or until the parser receives an
EOF from the input. If there is no data available and the parser expects
yet more input, the parser’s thread will be blocked until data is available
again.
A client of an asynchronous parser will be notified about the result of a semantic actions object and other events through the means of handler blocks which will be assigned the semantic actions object via properties. The exact behavior depends on the concrete semantic actions class. For more information on semantic actions see JPSemanticActionsProtocol, JPSemanticActionsBase, JPRepresentationGenerator and JPStreamSemanticActions.
A JPAsyncJsonParser object can only be used once for parsing the input. That is,
once the message start has been sent, it cannot be invoked again. In order to
parse another input, a new parser object must be created. The input can consist
of many JSON documents however, and the total length of the input stream can be
virtually infinitive.
Tasks
Initialization
-
– initWithSemanticActions:workerDispatchQueue:Designated Initializer
-
– initInvokes the designated initializer with parameter
semanticActionsset tonilandworkerQueueset toNULL.
Properties
-
semanticActionsReturns the semantic actions object.
property
Starting the Parser Asynchronously
-
– startStart the parser asynchronously. The parser will wait for data buffers to become available provided by method parseBuffer:. Once the first buffer is available, the parser will try to determine the encoding of the input. If any error occurs while detecting the encoding, the parser will issue an error which will cause the error handler to be called (if it is not
NULL). Otherwise, the parser will continue to parse the input from the buffers, until no more buffers are available.
Providing Data Buffers
-
– parseBuffer:Push a data buffer to the parser’s internal buffer queue which the parser will start to process when it becomes ready.
Canceling an Asynchronously Running Parser
-
– cancelSynchronously cancels the parser which forces it to exit as soon as possible. After returning from cancel, it is guaranteed that no blocks will be invoked and no delegate will receive any messages.
cancelwill block until the parser’s worker thread has been exited. After canceling the parser’s result and error state is undefined.
Check if a Parser is Running
-
– isRunningReturns
YESif the parser has been started and is currently running.
Instance Methods
cancel
Synchronously cancels the parser which forces it to exit as soon as possible.
After returning from cancel, it is guaranteed that no blocks will be invoked
and no delegate will receive any messages. cancel will block until the parser’s
worker thread has been exited.
After canceling the parser’s result and error state is undefined.
- (void)cancelDeclared In
JPAsyncJsonParser.hinit
Invokes the designated initializer with parameter semanticActions set to nil
and workerQueue set to NULL.
- (id)initDeclared In
JPAsyncJsonParser.hinitWithSemanticActions:workerDispatchQueue:
Designated Initializer
- (id)initWithSemanticActions:(JPSemanticActionsBase *)semanticActions workerDispatchQueue:(dispatch_queue_t)workerQueueParameters
- semanticActions
A semantic actions object or
nil.
- workerQueue
A dispatch queue or
NULL.
Discussion
If object semanticActions equals nil an instance of class JPRepresentationGenerator
will be created and initialized with default properties. The default values
which will be set are documented in class JPRepresentationGenerator.
If parameter workerQueue equals NULL the parsing routines will be scheduled
on the global dispatch queue. This is usually a good choice.
The semantic actions handler dispatch queue and the parser’s worker dispatch
queue must not be the same, unless the semantic actions object property
parseMultipleDocumentsAsynchronously equals YES.
Declared In
JPAsyncJsonParser.hisRunning
Returns YES if the parser has been started and is currently running.
- (BOOL)isRunningDeclared In
JPAsyncJsonParser.hparseBuffer:
Push a data buffer to the parser’s internal buffer queue which the parser will start to process when it becomes ready.
- (BOOL)parseBuffer:(NSData *)bufferParameters
- buffer
A
NSDataobject possibly containing a partial input. If buffer equalsnilthe parser treats it asEOFand stops parsing.
Return Value
Returns YES if the parser will consume this buffer. Returns NO if a
timeout occurred, or if the parser is in cancel or error state.
Discussion
The content of buffer may contain partial JSON text in which case subsequent
invocations of parseBuffer: will be required in order to finish parsing of
one or more JSON texts.
The method will block until after the parser is ready to consume this buffer, that is, when it has finished the previous buffer or when it is idle. It does not block however for the time it takes to process this buffer.
buffer will be retained for the duration of use and then released again.
Warning: Caution: The buffer’s byte sequence MUST start or end only at complete Unicode code unites. That is, for instance, UTF-8 encoded text may start and end at any byte boundary, while UTF-16 and UTF-32 requires to start and end at their respective code units (two bytes and four bytes).
Declared In
JPAsyncJsonParser.hstart
Start the parser asynchronously. The parser will wait for data buffers to
become available provided by method parseBuffer:. Once the first buffer is
available, the parser will try to determine the encoding of the input. If
any error occurs while detecting the encoding, the parser will issue an
error which will cause the error handler to be called (if it is not NULL).
Otherwise, the parser will continue to parse the input from the buffers,
until no more buffers are available.
- (BOOL)startReturn Value
Returns YES if the parser has not yet been started previously.
Discussion
Depending on the actual semantic actions object, their handlers may be called whenever the start of a JSON document was found in the input stream and whenever a JSON document has been created. Finally, if the end of the data is detected a completion handler may be called.
Declared In
JPAsyncJsonParser.h