异步下载图片小项目中遇到的问题总结


1.下载的图片大小和UITableViewCell默认的图片大小不匹配的时候,要对图片大小进行调整,方法如下:

//appImageData是从网上下载的图片的数据,转化为UIImage
    UIImage *image = [[UIImage alloc]initWithData:self.appImageData];
    //判断如果图片的大小和要求的大小不符合的话执行
    if (image.size.width != kAppIconSize ||image.size.height != kAppIconSize) {
        //创建期望的大小
        CGSize itemSize = CGSizeMake(kAppIconSize, kAppIconSize);
        //开始图像上下文,上下文的大小就是期望的大小
        UIGraphicsBeginImageContext(itemSize);
        //把图片画在期望的大小上
        CGRect imageRect = CGRectMake(0.0, 0.0, itemSize.width, itemSize.height);
        [image drawInRect:imageRect];
        //从上下文中取得上下文的图片,就是想要的图片大小
        self.appRecord.appImage = UIGraphicsGetImageFromCurrentImageContext();
        //结束上下文
        UIGraphicsEndImageContext();
    }

2,从xml文件中读取的图片URL地址必须要经过处理才能下载图片,去掉空格和新行字符,方法:

//必须要进行字符串处理,要不然下载不了图片
        NSString *str = [workingPropertyString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

3,NSXMLParser用法

当从XML文件中找到一个标签时就调用这个方法,在这个方法中初始化model

-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
    
    if([elementName isEqualToString:kEntryStr]){
        self.appEntry = [[[AppRecord alloc]init]autorelease];
    }
}



当找到标签的内容时调用:

-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{

    [self.workingPropertyString appendString:string];

}

用一个字符串记录标签的内容。

标签结束的时候调用:

-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{}
在这个函数中进行判断,然后对model进行处理。

if ([elementName isEqualToString:kNameStr]) {
            self.appEntry.appName = str;
        }
        else if([elementName isEqualToString:kImageURLStr]){
            self.appEntry.appImageURL = str;
        }


4.如果model中已经有了图片直接赋值,如果没有,用startDownload方法去网上下载,记住要有个“占位”的图片。

if (!record.appImage) {
        
            [self startDownloadIcon:record forIndex:indexPath];

cell.imageView.image = [UIImage imageNamed:@"Placeholder.png"]; } else{ cell.imageView.image = record.appImage; }

5,进行解析大的xml文件的时候要用多线程,要不会有界面假死现象

NSOperationQueue线程池,NSOperation代表一个线程,把一个线程加入线程池中执行:

    queue = [[NSOperationQueue alloc]init];
    ParseOperation *parser = [[ParseOperation alloc]init]
    [queue addOperation:parser];

-(void)main{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
    if (![self isCancelled]) {
        self.completionHandler(self.appEntriesArr);
    }
    [pool release];
}
上面的main方法是线程执行的main方法,其中调用主线程传给它的代码块。

void (^ArrayBlock)(NSArray *) completionHandler;

completionHandler就是下面的代码块。就是说一个线程执行完自己的操作后可以调用主线程的方法,传入主线程要用的东西。

^(NSArray*appList){
        dispatch_async(dispatch_get_main_queue(), ^{
            [self handleLoadedApps:appList]; 
        });
    }




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SV小项目-异步FIFO是一个简单的项目,旨在让学生理解FIFO缓存的原理和实现方式。 FIFO缓存是一种常用的数据存储方式,可以用于解决数据传输时的不匹配问题。在异步FIFO,数据的写入和读取是异步的,意味着数据可以在任何时候写入或读取。这种异步的方式可以增加FIFO的灵活性,并且允许数据的写入和读取在不同的时钟域上应用。 这个小项目的主要目标是实现一个基于Verilog的异步FIFO模块,包括以下功能: 1. 内部缓存的储存和检索 2. 空和满指示器的生成 3. 数据的写入和读取 对于写入操作,当FIFO未满时,它将数据存储在内部缓存,并更新其指针以指向下一个空位置。当缓存已满时,写入操作将被忽略,并且FIFO满指示器将被设置为高电平。同样,读取操作从内部缓存检索数据,并将其指针更新以指向下一个位置。当缓存为空时,读操作将被忽略,并且FIFO空指示器将被设置为高电平。 在设计过程,需要考虑解决的问题包括时序和异步信号的同步。时序问题可以通过FIFO指针和状态机解决,而异步信号可以通过信号同步器进行同步。此外,还需要考虑FIFO的读写顺序和存储器的尺寸,并确保FIFO模块的有效性和可靠性。 总之,通过实现SV异步FIFO项目,学生可以加深对FIFO缓存的理解,并学习基于Verilog的设计和实现。此外,学生还可以通过在项目遇到的挑战来提高他们的编程和设计技能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值