2010-05-24 1 views
27

크기가 약 1000kB 인 NSData 객체가 있습니다. 이제 블루투스를 통해이를 전송하려고합니다. 100kB의 오브젝트 10 개를 가지고 있다면 더 좋을 것입니다. NSData의 -subdataWithRange: 메서드를 사용해야한다는 사실을 염두에 두어야합니다.주어진 크기의 다른 NSData 객체로 NSData 객체 분할

저는 NSRange에서 실제로 작업하지 않았습니다. 글쎄요, 어떻게 작동하는지는 압니다 만, 주어진 위치에서 길이를 읽는 법을 알아낼 수는 없습니다 : '파일 끝까지'... 어떻게해야하는지 모르겠습니다.

이 코드를 여러 개의 100kB NSData 객체로 분할하는 방법에 대한 코드 중 일부는 실제로 여기서 도움이 될 것입니다. (얼마나 많은 물체를 만들어야 할지를 알기 위해서는 -length 메서드가 필요합니다.)

감사합니다.

+0

또한 Bluetooth 데이터 크기와 관련하여 http://developer.apple.com/library/ios/#DOCUMENTATION/NetworkingInternet/Conceptual/GameKit_Guide/GameKitConcepts/GameKitConcepts.html "최상의 성능을 얻으려면 크기 데이터 객체의 크기는 작게 유지됩니다 (길이가 1000 바이트 미만). " – user149100

답변

37

다음 코드 조각은 데이터를 복사하지 않고 분열을 수행

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); 

(!) 참고는 : myBlob 해제 (또는 기타 변경) 한 후 나는 청크 객체가 안전하게 사용할 수 없음을 추가해야합니다. chunk 조각이 myBlob이 소유 한 메모리를 가리 키므로 myBlob을 보유하지 않으면 조각을 보유하지 마십시오.

+0

나는 완전히 그것을 얻지 못하고있다. NSData * 청크 = [NSData dataWithBytesNoCopy : [myBlob 바이트] + 오프셋 길이 : thisChunkSize freeWhenDone : NO];'물론 경고를 던지고있다. 나는 당신이'[myBlob bytes] + offset'을 말할 수 있다고 생각하지 않는다. 오프셋은 바이트와 아무런 관련이 없습니다. 나는 여기서 당신의 논리를 이해하는 것 같지 않습니다. –

+0

컴파일러 경고를 제거하기 위해 코드를 편집했습니다. 나머지 코드는 내게 맞는 것처럼 보이지만 테스트하지 않고 작성했습니다. 'offset'은 이미 처리 된 바이트 수입니다. 이것이 모든 새로운 청크가 데이터 배열의 시작 부분과 'offset'에 초기화되는 이유입니다. –

+0

당신은'chunk' 객체가'myBlob'이 소유 한 메모리를 가리키고 있다고 말하고 있습니다. 블루투스를 통해 청크를 전송하면 상대방이 손상 될 수 있습니까? 아니면 내가 그들을 보낼 수 있다는 것을 의미합니까?하지만 myBlob를 공개 한 후에는 송신자 측에서 더 이상 사용할 수 없게됩니다. –