【问题标题】:how to NSKeyedUnarchiver with multiple chunk from bump?如何从凹凸中获取多个块的 NSKeyedUnarchiver?
【发布时间】:2012-04-15 10:14:26
【问题描述】:

遇到这个问题我想通过bump发送图片,但是bump api的最大块是256kb

 if([[NSKeyedArchiver archivedDataWithRootObject:self.selectedImg]length] > 262144)
    {
        int dlen = [[NSKeyedArchiver
                     archivedDataWithRootObject:self.selectedImg] length];
        NSLog(@"Sending data: %i bytes in %d chunks",dlen,
              (int)ceil(((float)dlen / 262144.0f)));
        for (int i=1; i <= (int)ceil(((float)dlen / 262144.0f)); i++) {
            int maxr=0;
            if ((262144*i) > dlen) {
                maxr = dlen-(262144*(i-1));
            } else {
                maxr = 262144;
            }

            NSData *moveChunk = [[NSKeyedArchiver
                                  archivedDataWithRootObject:self.selectedImg]
                                 subdataWithRange:NSMakeRange(262144*(i-1),maxr)];
            NSLog(@"Sending Chunk: %d, %d bytes",i,[moveChunk length]);
            [bumpObject sendData:moveChunk];
        }
    }
    else
    {
        //Data is 254kb or under
        NSData *moveChunk = [NSKeyedArchiver
                             archivedDataWithRootObject:self.selectedImg];
        [bumpObject sendData:moveChunk];
    } 

如何将所有块编译在一起?

已经花了 3 个小时,但无法解决。

【问题讨论】:

  • 为什么不将[NSKeyedArchiver archivedDataWithRootObject:self.selectedImg] 的值赋给一个变量呢?我认为在系统资源上创建一个数据对象可能不是微不足道的......(另外,你为什么不直接做dlen / 262144?整数除法无论如何都会截断)。
  • 错误这是发送数据,这很好。但我需要知道如何从设备的另一端返回
  • 这样读起来很难。

标签: iphone ios xcode nskeyedarchiver


【解决方案1】:

好的,我还没有真正尝试过,但这里是。

在接收端,获取接收到的 NSData 对象,并将它们合并为具有-[NSMutableData appendData:]-[NSMutableData appendBytes:length:] 的 NSMutableData 实例。 (从-[NSData bytes]-[NSData length] 获取字节

然后,使用+[NSKeyedUnarchiver unarchiveObjectWithData:] 取回图像。

...像这样(设置一个 NSMutableData 属性,假设称为receivedImageData)...

- (void) bumpDataReceived:(NSData *)chunk {
    if (!self.receivedImageData) {
        self.receivedImageData = [NSMutableData dataWithCapacity:[chunk length]];
        [self.receivedImageData setData:chunk];
    } else {
        [self.receivedImageData appendData:chunk];
    }
}

...然后,当你得到最后一个块时(它的大小不等于 262144?在-bumpSessionEnded:?)用

取回图像对象
UIImage* receivedImage = [NSKeyedUnarchiver unarchiveObjectWithData:self.receivedImageData];

完成!

【讨论】:

    猜你喜欢
    • 2011-10-05
    • 2016-11-21
    • 2014-04-04
    • 1970-01-01
    • 2013-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多