将我的项目转换为ARC,但需要帮助处理上传和下载文件的这两段代码:
- (void)connection:(NSURLConnection *)connection didSendBodyData:(NSInteger)bytesWritten totalBytesWritten:(NSInteger)totalBytesWritten totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite{
[delegate performSelector:progressSelector withObject:(id)(100*totalBytesWritten /totalBytesExpectedToWrite)];
然后是以下代码,特别是最后一行:
- (void)connection:(NSURLConnection *)con // IN
didReceiveData:(NSData *)data // IN
{
NSLog(@"%s: self:0x%p\n", __func__, self);
NSInteger dataLength;
const uint8_t * dataBytes;
NSInteger bytesWritten;
NSInteger bytesWrittenSoFar;
dataLength = data.length;
dataBytes = (const uint8_t * )data.bytes;
bytesWrittenSoFar = 0;
if(fileStream!=NULL)
{
do {
NSLog(@"%d",(int)bytesWrittenSoFar);
bytesWritten = [fileStream write:&dataBytes[bytesWrittenSoFar] maxLength:dataLength - bytesWrittenSoFar];
assert(bytesWritten != 0);
if (bytesWritten == -1)
{
[self downloadSucceeded:NO];
break;
}
else
{
bytesWrittenSoFar += bytesWritten;
}
}
while (bytesWrittenSoFar != dataLength);
}
dataSize+=data.length;
if(dataSize==downloadSize)
{
downloadDidSucceed=TRUE;
}
[delegate performSelector:progressSelector withObject:(id)(long)(100*dataSize/downloadSize)];
}
感谢任何帮助
答案 0 :(得分:2)
你的问题在这里
[delegate performSelector:progressSelector withObject:(id)(long)(100*dataSize/downloadSize)];
试试这个
[delegate performSelector:progressSelector withObject:[NSnumber numberWithLong:(100*dataSize/downloadSize)]];
答案 1 :(得分:0)
在Objective-C中,标量值如int / long / float / double和对象类型之间存在区别。
id类型是匿名对象类型。你不知道它是什么,但你知道它是一个对象。
long
不是,也不可能是对象。这是一个简单的标量值。这就是为什么编译器不允许你将你的长期转换为ID类型。
Sh_Khan通过创建一个包含您的值的对象来解决问题,以解决问题。您也可以使用NSNumber
来获得相同的效果,但NSValue
可以表示您无法用NSValue
表示的结构。