FROM : Joan Lluch (casa)
DATE : Sun Jun 08 20:51:25 2008
El 08/06/2008, a las 20:13, Brent Fulgham escribió:
> I've been enjoying the NSArray/NSMutableArray classes as I work with
> various user interface features for a program I'm working on that
> interacts with a legacy C++ library.
>
> I've recently begun considering how to efficiently display the
> contents of a binary data stream. Currently I'm appending to an
> NSMutableArray of NSNumber objects, which is great for allowing me
> to bind to some UI elements in close to real time and has provided a
> simple and functional mechanism for text numerical display.
>
> Ideally, I'd like to be able to access a raw binary buffer of data
> so I could for example bind it to something like an OpenGL vector
> buffer for display. However, unlike an STL vector, I don't think
> the NS[Mutable]Array provides any guarantees of memory organization,
> nor any way to 'unbox' the NSNumber to deal with the internal values.
>
> For example, in the STL, I could make use of the fact that the
> vector template guarantees the storage to be in contiguous memory
> and accessible as raw double values through the address of the first
> element of the vector. However, I don't think this is possible via
> NSMutableArray and NSNumbers.
>
> Is my only option to periodically sync a buffer of binary double
> values by copying from the NSMutableArray on some periodic basis?
>
> Thanks,
>
> -Brent
>
Since each item contained in an NSArray is a pointer to an object, you
will not be able to retrieve them as raw data of different size even
if the pointers in the NSArray were contiguous (which I believe they
are)
Did you consider using a NSMutableData object (or even a CFMutableData
for efficiency) instead?
You can use an intermediate (fixed length) C vector to receive the
stream and transfer it in crunches to a CFMutableData object using the
CFDataAppendBytes function. Then you can retrieve contiguous data of
any length using the C pointer provided by CFDataBytePtr. However you
will still have to transfer it to a NSArray to easily bind it to an
user interface element such as a TableView.
I guess you will have to consider if you give priority to the ease of
binding to the UI or to the ease of accessing arbitrary length values
from the stream.
I would store the data in a CFMutableData object and then transfer it
to a NSMutableArray when needed, not the other way round, but of
course that depends on what you specifically want to achieve.
DATE : Sun Jun 08 20:51:25 2008
El 08/06/2008, a las 20:13, Brent Fulgham escribió:
> I've been enjoying the NSArray/NSMutableArray classes as I work with
> various user interface features for a program I'm working on that
> interacts with a legacy C++ library.
>
> I've recently begun considering how to efficiently display the
> contents of a binary data stream. Currently I'm appending to an
> NSMutableArray of NSNumber objects, which is great for allowing me
> to bind to some UI elements in close to real time and has provided a
> simple and functional mechanism for text numerical display.
>
> Ideally, I'd like to be able to access a raw binary buffer of data
> so I could for example bind it to something like an OpenGL vector
> buffer for display. However, unlike an STL vector, I don't think
> the NS[Mutable]Array provides any guarantees of memory organization,
> nor any way to 'unbox' the NSNumber to deal with the internal values.
>
> For example, in the STL, I could make use of the fact that the
> vector template guarantees the storage to be in contiguous memory
> and accessible as raw double values through the address of the first
> element of the vector. However, I don't think this is possible via
> NSMutableArray and NSNumbers.
>
> Is my only option to periodically sync a buffer of binary double
> values by copying from the NSMutableArray on some periodic basis?
>
> Thanks,
>
> -Brent
>
Since each item contained in an NSArray is a pointer to an object, you
will not be able to retrieve them as raw data of different size even
if the pointers in the NSArray were contiguous (which I believe they
are)
Did you consider using a NSMutableData object (or even a CFMutableData
for efficiency) instead?
You can use an intermediate (fixed length) C vector to receive the
stream and transfer it in crunches to a CFMutableData object using the
CFDataAppendBytes function. Then you can retrieve contiguous data of
any length using the C pointer provided by CFDataBytePtr. However you
will still have to transfer it to a NSArray to easily bind it to an
user interface element such as a TableView.
I guess you will have to consider if you give priority to the ease of
binding to the UI or to the ease of accessing arbitrary length values
from the stream.
I would store the data in a CFMutableData object and then transfer it
to a NSMutableArray when needed, not the other way round, but of
course that depends on what you specifically want to achieve.
| Related mails | Author | Date |
|---|---|---|
| Brent Fulgham | Jun 8, 20:13 | |
| Jean-Daniel Dupas | Jun 8, 20:29 | |
| Joan Lluch (casa) | Jun 8, 20:51 | |
| Jean-Daniel Dupas | Jun 8, 21:56 |






Cocoa mail archive

