2010-05-24 38 views
27

Tôi có đối tượng NSData có kích thước xấp xỉ 1000kB. Bây giờ tôi muốn chuyển qua Bluetooth. Sẽ tốt hơn nếu tôi có, giả sử, 10 đối tượng của 100kB. Tôi nghĩ rằng tôi nên sử dụng phương thức -subdataWithRange: của NSData.Chia đối tượng NSData thành các đối tượng NSData khác có kích thước nhất định

Tôi chưa thực sự làm việc với NSRange. Vâng, tôi biết nó hoạt động như thế nào, nhưng tôi không thể tìm ra cách đọc từ một vị trí cụ thể với độ dài: 'đến cuối tập tin' ... Tôi không biết làm thế nào để làm điều đó.

Một số mã về cách chia nhỏ thành nhiều đối tượng NSData 100kB thực sự sẽ giúp tôi ở đây. (nó có thể liên quan đến phương pháp -length để xem có bao nhiêu đối tượng nên được thực hiện ..?)

Cảm ơn bạn trước.

+0

Cũng liên quan đến kích thước dữ liệu Bluetooth, từ http://developer.apple.com/library/ios/#DOCUMENTATION/NetworkingInternet/Conceptual/GameKit_Guide/GameKitConcepts/GameKitConcepts.html "Để có hiệu suất tốt nhất, bạn nên kích thước của các đối tượng dữ liệu được giữ nhỏ (dưới 1000 byte chiều dài). " – user149100

Trả lời

37

Các đoạn mã sau đây không phân mảnh mà không cần sao chép các dữ liệu:

NSData* myBlob; 
NSUInteger length = [myBlob length]; 
NSUInteger chunkSize = 100 * 1024; 
NSUInteger offset = 0; 
do { 
    NSUInteger thisChunkSize = length - offset > chunkSize ? chunkSize : length - offset; 
    NSData* chunk = [NSData dataWithBytesNoCopy:(char *)[myBlob bytes] + offset 
             length:thisChunkSize 
            freeWhenDone:NO]; 
    offset += thisChunkSize; 
    // do something with chunk 
} while (offset < length); 

Sidenote: Tôi nên thêm rằng các đối tượng đoạn không thể an toàn được sử dụng sau myBlob đã được phát hành (hoặc sửa đổi). chunk phân đoạn trỏ vào bộ nhớ thuộc sở hữu của myBlob, do đó, không giữ lại chúng trừ khi bạn giữ lại myBlob.

+0

Tôi không hoàn toàn nhận được điều đó. 'NSData * chunk = [Dữ liệu NSDataWithBytesNoCopy: [myBlob bytes] + độ dài offset: thisChunkSize freeWhenDone: NO];' đang ném một cảnh báo tất nhiên. Tôi không nghĩ bạn có thể nói '[myBlob bytes] + offset'. Bù đắp không liên quan gì đến byte. Tôi dường như không hiểu logic của bạn ở đây. –

+0

Tôi đã chỉnh sửa mã để loại bỏ cảnh báo trình biên dịch. Phần còn lại của mã có vẻ phù hợp với tôi, mặc dù tôi đã viết nó mà không cần kiểm tra. 'offset' là số byte đã được xử lý. Đó là lý do tại sao mỗi đoạn mới được khởi tạo ở đầu mảng dữ liệu cộng với 'offset'. –

+0

Bạn đang nói rằng các đối tượng 'chunk' trỏ vào bộ nhớ thuộc sở hữu của' myBlob'. Điều này có nghĩa là khi tôi chuyển khối qua bluetooth họ sẽ bị hỏng ở phía bên kia? Hay bạn có nghĩa là tôi có thể gửi chúng nhưng chúng sẽ không còn ở bên phía người gửi sau khi phát hành 'myBlob'? –

Các vấn đề liên quan