4

我正在尝试将以下方法移植到 RubyMotion

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    NSInteger       dataLength = [data length];
    const uint8_t * dataBytes  = [data bytes];
    NSInteger       bytesWritten;
    NSInteger       bytesWrittenSoFar;

    bytesWrittenSoFar = 0;
    do {
        bytesWritten = [self.downloadStream write:&dataBytes[bytesWrittenSoFar] maxLength:dataLength - bytesWrittenSoFar];
        assert(bytesWritten != 0);
        if (bytesWritten == -1) {
            [self cleanupConnectionSuccessful:NO];
            break;
        } else {
            bytesWrittenSoFar += bytesWritten;
        }
    } while (bytesWrittenSoFar != dataLength);

    self.progressContentLength += dataLength;
}

(来自robertmryan/download-manager

这就是我目前所拥有的,它在调用 downloadStream 时崩溃connection:didReceiveData:': can't convert Fixnum into String (TypeError)

def connection(connection, didReceiveData:data)
  dataLength = data.length
  dataBytes = data.bytes
  bytesWritten = 0
  bytesWrittenSoFar = 0

  begin
    maxLength = dataLength - bytesWrittenSoFar
    buffer = dataBytes[bytesWrittenSoFar]
    bytesWritten = self.downloadStream.write buffer, maxLength: maxLength # CRASH
    if bytesWritten == -1
      self.cleanupConnectionSuccessful false
      break
    else
      bytesWrittenSoFar += bytesWritten
    end
  end while bytesWrittenSoFar != dataLength

  self.progressContentLength += dataLength

  if self.delegate.respondsToSelector('downloadDidReceiveData:')
    self.delegate.downloadDidReceiveData(self)
  end
end

我意识到我的转换忽略了指针可能是幼稚和错误的。我检查了 RubyMotion 文档,但它们有点稀疏,而且我对 C 的理解还不够强,无法知道如何在此处应用它。一些建议将不胜感激。

4

1 回答 1

4

bytes方法NSData返回一个Pointer类型(http://www.rubymotion.com/developer-center/api/Pointer.html)。

类型中的[]方法Pointer使您可以从指针开始访问该位置的元素。在我看来,它bytes返回Pointer类型为“C”(无符号字符)的 a,因此当您尝试访问Pointer类似的内容时dataBytes[bytesWrittenSoFar],您只能Fixnum从指针的开头获得 a,它是该字节的值。

要执行您想做的事情,您需要以下内容:

bytesWrittenSoFar = 0

begin
  maxLength = dataLength - bytesWrittenSoFar
  buffer = dataBytes + bytesWrittenSoFar
  bytesWritten = self.downloadStream.write buffer, maxLength: maxLength
  if bytesWritten == -1
    self.cleanupConnectionSuccessful false
    break
  else
    bytesWrittenSoFar += bytesWritten
  end
end while bytesWrittenSoFar != dataLength

我还没有运行它,但我希望它有效。

于 2013-06-13T13:53:43.257 回答