2014-04-11 4 views
0

목표 C를 처음 사용하고 네트워크 프로젝트 프레임 워크 MultipeerConnectivity을 기반으로하는 iOS 모바일 앱에서 작업하고 있습니다. 이 프레임 워크는 저에게 메시지를 보내고 장치들간에 메시지 메쏘드를받습니다.Objective C MultipeerConnectivity 프레임 워크에서 NSObject 데이터를 전송하는 방법

여기에 나와있는 MyMessage NSObject를이 함수를 통해 다음과 같이 보내면 다른 종류의 데이터를 전송할 수 있습니다. 그러나 단일 메시지 개체에 여러 정보 개체가 들어있는 NSMutableArray을 포함하고 싶습니다.

@interface MyMessage : NSObject 
{ 
    NSMutableArray playersInfo; 
} 
@end 

Objective C에서 이와 같이 인터페이스 유형을 정적으로 할당 할 수 없음을 알고 있습니다. 대신 포인터를 사용해야합니다. 그러나이 경우 playersInfo을 포인터 NSMutableArray* playersInfo으로 설정하면 개체가 다른 장치로 전송 된 후 다른 장치는 playersInfo이 가리키는 데이터를 가져올 수 없습니다. (MyMessage 객체는 얕은 콥트 만 사용하여 전송되므로 NSMutableArray* playersInfo의 데이터는 전송되지 않습니다.) 여기 NSObject 데이터를 실제로 포함 할 수있는 메시지 클래스를 어떻게 얻을 수 있는지 묻습니다.

+0

http://stackoverflow.com/questions/19851510/convert-any-data-type-into-nsdata-and-back-again/19851893#19851893 – Shad

답변

0
MultipeerConnectivity framework allows you to send NSData using MCSession API . convert your NSArray to NSData then send 

[self.session 같이 sendData : messageData의 toPeers : self.session.connectedPeers의 withMode : MCSessionSendDataReliable 오류 : & 오류];

NSArray를

있는 NSArray * = 배열로 변환을 NSData [NSKeyedUnarchiver unarchiveObjectWithData : 데이터]

을 NSData

에있는 NSArray 변환

는 NSString * 에러; NSData * data = [NSPropertyListSerialization dataFromPropertyList : 배열 형식 : NSPropertyListBinaryFormat_v1_0 errorDescription : & 오류];

+0

감사합니다. 예, 전송을 위해 MyMessage 객체를 NSData로 변환해야한다는 것을 알고 있습니다. 그러나이 경우 NSMutable Array를 넣으려는 MyMessage 클래스에 있습니다. MyMessage 객체에서 Archive 만 호출하면 객체의 NSMutable Array 포인터가 가리키는 데이터가 손실됩니까? 그렇다면 어떻게 해결해야합니까? – user3522180

1

모든 구현과 마찬가지로, 데이터를 보내려면 프리미티브, 구조체 또는 객체를 통신 링크를 통해 전송할 수있는 데이터 블록으로 분해해야합니다. 경우에 따라이를 직렬화라고합니다 (일반적으로 객체에 적용 할 때)

iOS에서는 객체를 NSKeyedArchive/Unarchive를 사용하여 직렬화 할 수 있습니다. 따라서 사용자의 배열에 저장 한 각 객체는 NSCoding을 준수하여 아카이브/아카이브 해제 논리를 구현해야합니다.

그런 다음 직렬화 된 데이터 (NSData 객체)를 생성하려면 배열에서 아카이버를 호출합니다 목적. NSArray는 NSCoding 프로토콜을 따릅니다.

당신이 가고 싶은 곳은 구현에 달려 있습니다. encodeWithCoder 구현의 일부로 인코딩/디코딩하려는 객체 속성 수를 결정합니다.

나는이 패턴을 사용하여 피어와 데이터를 교환하지만 상속을 사용하여 데이터를 확장합니다. 예를 들어 클래스를 정의합니다. myMessageBase는 그런 다음 내 다양한 ​​Message 변형 각각에 해당 Base 클래스를 상속합니다.

+0

감사합니다. 예, 전송을 위해 MyMessage 객체를 NSData로 변환해야한다는 것을 알고 있습니다. 그러나이 경우 NSMutable Array를 넣으려는 MyMessage 클래스에 있습니다. MyMessage 객체에서 Archive 만 호출하면 객체의 NSMutable Array 포인터가 가리키는 데이터가 손실됩니까? 그렇다면 어떻게 해결해야합니까? – user3522180

+0

encodeWithCoder를 구현하면 NSMutableArray에서 encode가 호출됩니다. NSCoding 프로토콜 참조를 읽었습니까? Google의 경우 매우 간단하고 많은 예제가 있습니다. 레이 윈델 리치 예를 들면? – 300baud