3

マルチピア接続フレームワークをアプリケーションに実装しようとしています。

私はこれを成功させました。ユーザーができるようにしたいのは、カメラロールから写真のようなものを選択して、接続されている別のデバイスに渡すことです。UIImageだけでなく、他のものでもやっています(NSString、NSObjectなど)。

理想的には、私ができるようにしたいのは、次の 2 つの方法のいずれかを使用して、それを使用および受信できるようにすることです。

- (void)session:(MCSession *)session didReceiveStream:(NSInputStream *)stream withName:(NSString *)streamName fromPeer:(MCPeerID *)peerID;

また

- (void)session:(MCSession *)session didReceiveData:(NSData *)data fromPeer:(MCPeerID *)peerID {

ただし、私が望むのは、マルチピア接続を使用して別のデバイスに渡すための標準化された方法 (すべてのオブジェクト タイプに対して) です。

私の唯一の考えは、各オブジェクトを NSData に変換してから渡すことでしたが、これは受信側では機能しません。私のテストは次のとおりです。

NSData *myData = [NSKeyedArchiver archivedDataWithRootObject:self.myImage];
NSLog(@"%@", myData);

次に、それを元に戻す方法がわかりません。それはNSCodingと関係がありますか?? どんなアイデアでも大歓迎です!:) ありがとうございました!!

4

2 に答える 2

3

データを受信したときに NSKeyedUnarchiver を使用するだけでよいのです。

- (void)session:(MCSession *)session didReceiveData:(NSData *)data fromPeer:(MCPeerID *)peerID {

    id myObject = [NSKeyedUnarchiver unarchiveObjectWithData:data];
}

そこから、実際に受け取ったオブジェクトの種類を判断できます。

if ([myObject isKindOfClass:[SomeClass class]]){

   //Handle
}

これは、NSCoding プロトコルに準拠している限り、どのクラスでも機能します。見てみましょう:オブジェクトのエンコードとデコード

于 2013-10-25T14:36:05.897 に答える
3

私が提案するのは、デバイス間で NSData オブジェクトを転送するためのプロトコルを実装することです。デバイス間で送信する標準化されたパケットを用意します。そのような

type | length | data....

タイプと長さは整数である必要があるため、反対側に到達したときにサイズが正確にわかります。長さは、実際のパケットの長さを示します。

簡単な例

// method received "(id) data" which can be UIImage, NSString, NSDictionary, NSArray

// 1 -> Image
// 2 -> JSON
uint32_t type;

if ([data isKindOfClass:[UIImage class]]) {
   data = UIImageJPEGRepresentation((UIImage *)data, 1.0);
   type = 0;
} else {
   data = [data JSONData];
   type = 1;
}

uint32_t length = [data length];

NSMutableData *packet = [NSMutableData dataWithCapacity:length + (INT_32_LENGTH * 2)];
[packet appendBytes:&type length:INT_32_LENGTH];
[packet appendBytes:&length length:INT_32_LENGTH];
[packet appendData:data];

次に、パケットの長さを読み取ってタイプを確認し、正しいオブジェクトタイプに変換します。画像の場合はバイナリ パケットとして送信し、その他の場合は JSON として送信します。

それが役立つことを願っています。

于 2013-10-25T13:18:36.310 に答える