精华内容
下载资源
问答
  • 这时候就需要将任务放到一个队列中,然后循环子线程中执行任务。所以,这里来介绍一下该场景的框架设计,如何子线程中执行耗时任务队列。 二、代码 #ifndef TASKLIST_H #define TASKLIST_H #include <...

    一、说明
    在项目中经常会遇到文件的批量上传、下载等基本操作。这时候就需要将任务放到一个队列中,然后循环在子线程中执行任务。所以,这里来介绍一下该场景的框架设计,如何在子线程中执行耗时任务队列。

    二、代码

    #ifndef TASKLIST_H
    #define TASKLIST_H
    
    #include <QWidget>
    #include <QThread>
    #include <QList>
    #include <QMutex>
    #include <QUuid>
    #include <QEventLoop>
    #include <QTimer>
    #include <QDebug>
    #include <QWidget>
    #include <QNetworkAccessManager>
    #include <QNetworkReply>
    
    class TaskItem : public QObject
    {
        Q_OBJECT
    public:
        TaskItem(const QString& fileName,const QUrl& url,const QUuid& uuid,QObject* parent = nullptr);
        ~TaskItem();
        bool download();
        QUuid uuid(){return m_uuid;}
    signals:
        void finish(QUuid uuid);
    private:
        QUrl m_url;
        QUuid m_uuid;
        QNetworkAccessManager *m_pMgr;
    };
    
    class fileDownloadWork : public QThread
    {
        Q_OBJECT
    public:
        fileDownloadWork(QObject *parent = nullptr);
        ~fileDownloadWork();
    
        void run() override;
        void stop(){m_bStop = true;}
    
        void addTask(TaskItem* task);
        TaskItem* popTask();
    private:
        bool m_bStop;
        QList<TaskItem*> m_taskList;
        QMutex m_mutex;
    };
    
    class TaskList : public QObject
    {
        Q_OBJECT
    public:
        TaskList(QObject *parent = nullptr);
        ~TaskList();
    };
    
    #endif // TASKLIST_H
    
    
    #include "tasklist.h"
    
    TaskItem::TaskItem(const QString &fileName, const QUrl &url, const QUuid &uuid, QObject *parent):
        QObject(parent),
        m_url(url),
        m_uuid(uuid)
    {
    
    }
    
    TaskItem::~TaskItem()
    {
        delete m_pMgr;
        m_pMgr = nullptr;
    }
    
    bool TaskItem::download()
    {
        QEventLoop loop;
        QNetworkRequest req;
        req.setUrl(m_url);
    
        //QSslConfiguration用于SSL连接的配置。
        //QSslConfiguration是Qt networking下的一个类,这个类主要用于打开SSL连接,以及控制该连接下的某些特性。
        //QSslConfiguration支持下面的设置:
        //1. SSL/TLS协议的使用;
        //2. 对方的证书以及私钥;
        //3. 支持加密链接;
        //4. 验证证书机构;
        //这些都是在握手的时候设置的。连接之后设置这些是没有用的。
        //QSslConfiguration支持如下的状态:
        //1. 握手时对方的证书,以及指向CA连接的证书;
        //2. 会话的加密;
        //只有在SSL连接后,才能获取这些。
        //QSslConfiguration通常和QSslSocket和the Network Access API一起使用。
    
        QSslConfiguration conf = req.sslConfiguration();
        conf.setPeerVerifyMode(QSslSocket::VerifyNone);
        conf.setProtocol(QSsl::TlsV1SslV3);
        req.setSslConfiguration(conf);
    
        m_pMgr = new QNetworkAccessManager;
        QNetworkReply *reply = m_pMgr->get(req);
        connect(reply,&QNetworkReply::finished,this,[&](){
            qDebug()<<"TaskItem::download "<<reply->errorString();
            reply->abort();
            reply->deleteLater();
            loop.exit();
        });
        QTimer::singleShot(10000,this,[&](){
            loop.exit();
        });
        loop.exec();
        return true;
    }
    
    fileDownloadWork::fileDownloadWork(QObject *parent):
        m_bStop(false)
    {
    
    }
    
    fileDownloadWork::~fileDownloadWork()
    {
    
    }
    
    void fileDownloadWork::run()
    {
        while (!m_bStop) {
            TaskItem *item = popTask();
            if(item){
                if(item->download()){
                    emit item->finish(item->uuid());
                    delete item;
                    item = nullptr;
                }
            }
            msleep(10);
            qDebug()<<"QThread::currentThreadId "<<QThread::currentThreadId();
        }
    }
    
    void fileDownloadWork::addTask(TaskItem *task)
    {
        m_mutex.lock();
        m_taskList.push_back(task);
        m_mutex.unlock();
    }
    
    TaskItem *fileDownloadWork::popTask()
    {
        m_mutex.lock();
        TaskItem *item;
        if(m_taskList.isEmpty()){
            item = nullptr;
            m_bStop = true;
        }else{
            item = m_taskList.takeFirst();
            m_bStop = false;
        }
        m_mutex.unlock();
        return item;
    }
    
    TaskList::TaskList(QObject *parent):
        QObject(parent)
    {
        fileDownloadWork *d = new fileDownloadWork(this);
        d->addTask(new TaskItem("1",QUrl("https://www.baidu.com"),QUuid::createUuid()));
        d->addTask(new TaskItem("2",QUrl("https://www.baidu.com"),QUuid::createUuid()));
        d->start();
    
        d->addTask(new TaskItem("3",QUrl("https://www.baidu.com"),QUuid::createUuid()));
        d->addTask(new TaskItem("4",QUrl("https://www.baidu.com"),QUuid::createUuid()));
    
    }
    
    TaskList::~TaskList()
    {
    
    }
    
    
    展开全文
  • 队列多线程下载图片

    2018-01-24 10:19:34
    然后下载图片的线程从队列中获得图片地址,下载并保存到本地磁盘。 使用方法:下载后解压压缩包,放入本地磁盘固定的文件夹中,然后Eclipse或MyEclipse导入项目即可,项目路径中包含docs文件夹,里面有数据库表...
  • 汗今天自己作了一个队列下载的单例类。目的就是解决并发的问题和使用Loader的易用性。 原理是,生成了一个类的单例,全局使用。单例包括一个Timer时间轮训,一个array的下载URL列表,一个加载顺序的策略...

    前几天应征Flash程序员。被问到为什么Flash有时候Loader下载会无缘无故暂停,既不报超时也不报错。当时没想到为什么?后来被告知正确答案是FlashPlayer的并发下载的Bug。汗
    今天自己作了一个队列下载的单例类。目的就是解决并发的问题和使用Loader的易用性。
    原理是,生成了一个类的单例,在全局使用。单例中包括一个Timer时间轮训,一个array的下载URL列表,一个加载顺序的策略。很简单
    如果感兴趣的朋友可以拿去用,哈哈。欢迎大家和我讨论。
    CODE:
    LoadLine.as

    复制内容到剪贴板
    代码:
    package com.FSC.UI.InterActiveObject.DisplayObjectContainer.LoadLine
    {
        import flash.display.MovieClip;
        import flash.display.Loader;
        import flash.net.URLRequest;
        import flash.utils.Timer;
        import flash.events.*;
        /**下载队列类
         * @ andy pan
         * @ v1.080506
         */
        public class LoadLine extends MovieClip
        {
            private static var loadLine:LoadLine;
            private static var key:Boolean=false;
            private var _loader:Loader= new Loader();
            private var _loaderList:Array = new Array();
            private var _timer:Timer = new Timer(500);
            private var _isNowLoading:Boolean=false;
            //加载失败尝试次数
            private var _tryErrorTime:Number=1;
            //当前加载失败次数
            private var _tryErrorNowTime:Number = 0;
            public function LoadLine()
            {
                if( !key ){
                    throw new Error ("单例,请用 getInstance() 取实例。");
                }
                key=false;
                _timer.addEventListener(TimerEvent.TIMER,everySed);
                _timer.start();
                _loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onCompleteHandler);
                _loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, onError);
                   _loader.contentLoaderInfo.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onError);      
                   _loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, progressHandler);
            }
            
            public static function getInstance() : LoadLine {
                if ( loadLine == null ){
                     key=true;
                    loadLine = new LoadLine();
                }
                return loadLine;
            }
            
            /**静态函数 下载命令
            * @param target下载地址
            */
            public function loadFile(target:URLRequest,emergent:Number=10){
                if(emergent==0){
                    _loaderList.unshift(target);
                    if(_isNowLoading){
                        //如果有正在加载的项目则 暂停
                        cancelNowLoad();
                    }
                }else{
                    _loaderList.push(target);
                }
            }
            /**终止当前下载
            */
            private  function cancelNowLoad(){
                _loader.close();
            }
            /**每秒监听 队列是否有下载
            * @param e 时间参数
            */
            private function everySed(e:TimerEvent){
                //但下载器空闲时
                if((!_isNowLoading)&&(_loaderList.length>0)){
                    var tmp_url:URLRequest = _loaderList[0] as URLRequest;             
                    _loader.load(tmp_url);
                    this.addChild(_loader);
                    _isNowLoading = true;
                }
            }
            /**当前下载中的侦听
            */
            private function progressHandler(e:ProgressEvent){
                this.dispatchEvent(new LoadLineProgressEvent(ProgressEvent.PROGRESS,_loaderList[0],false,false,e.bytesLoaded,e.bytesTotal));
            }
            /**当前下载完成
            */
            private function onCompleteHandler(e:Event){
                this.dispatchEvent(new LoadLineEvent(LoadLineEvent.ONLOADLINECOMPLETE,_loaderList[0],_loader.content));
                _loaderList.shift();//当完成下载后再从队列中删除
                _isNowLoading = false;
            }
            /**当加载错误进行尝试处理
            */
            private function onError(e:IOErrorEvent){
                _isNowLoading = false;
                if(_tryErrorNowTime>_tryErrorTime){
                    trace("error:下载队列中有文件加载失败,并且超过尝试次数。已从队列中删除")
                    this.dispatchEvent(new LoadLineEvent(LoadLineEvent.ONLOADLINECOMPLETE,_loaderList[0],false));
                    _tryErrorNowTime=0;
                    //当完成下载后再从队列中删除
                    _loaderList.shift();
                }else{
                    _tryErrorNowTime++;
                }
            }        
        }
    }

    自定义加载完成的事件类
    LoadLineEvent.as

    复制内容到剪贴板
    代码:
    package com.FSC.UI.InterActiveObject.DisplayObjectContainer.LoadLine
    {
        import flash.events.Event;
        import flash.net.URLRequest;
        public class LoadLineEvent extends Event
        {
            public static var ONLOADLINECOMPLETE : String = "onLoadLineComplete";
            public var currentTragetURL:URLRequest;
            public var content:*;
            public var isSuccess:Boolean
            public function LoadLineEvent(type:String,URL:URLRequest,content,isSuccess:Boolean = true, bubbles:Boolean=true, cancelable:Boolean=false)
            {
                super(type, bubbles, cancelable);
                this.currentTragetURL = URL;
                this.isSuccess = isSuccess;
                this.content = content;
            }
            
        }
    }

    自定义加载过程中的事件类
    LoadLineProgressEvent.as

    复制内容到剪贴板
    代码:
    package com.FSC.UI.InterActiveObject.DisplayObjectContainer.LoadLine
    {
        import flash.events.ProgressEvent;
        import flash.net.URLRequest;
        public class LoadLineProgressEvent extends ProgressEvent
        {
            public var currentTragetURL:URLRequest;
            public function LoadLineProgressEvent(type:String,URL:URLRequest, bubbles:Boolean=false, cancelable:Boolean=false, bytesLoaded:uint=0.0, bytesTotal:uint=0.0)
            {
                super(type, bubbles, cancelable, bytesLoaded, bytesTotal);
                this.currentTragetURL = URL;
            }
            
        }
    }

    使用方法如下:
    import com.FSC.UI.InterActiveObject.DisplayObjectContainer.LoadLine.*;
    var l:LoadLine = LoadLine.getInstance();
    l.addEventListener(LoadLineEvent.ONLOADLINECOMPLETE,onComplete);
    l.addEventListener(ProgressEvent.PROGRESS,onProgress);
    //插入可用的url
    l.loadFile(new URLRequest("http://static16.photo.sina.com.cn/bmiddle/54a5adcd44b992988febf"));
    //插入错误的url
    l.loadFile(new URLRequest("http://error.error.cn/error.htm"));
    //插入可用的url
    l.loadFile(new URLRequest("http://static3.photo.sina.com.cn/bmiddle/54a5adcd44b9926c6faf2"));
    //插入可用的url 这里插入紧急级别为0(就是最高级别的)的URL 程序会停止当前下载过程,然后执行该下载
    l.loadFile(new URLRequest("https://mail.google.com/mail/help/images/logo.gif"),0);

    function onComplete(e:LoadLineEvent) {
           trace(e.currentTragetURL.url);
           if (e.isSuccess && e.currentTragetURL.url =="http://static16.photo.sina.com.cn/bmiddle/54a5adcd44b992988febf") {
                  var bbb:* = e.content;
                  bbb.y=0;
                  addChild(bbb);
           }
    }
    function onProgress(event:LoadLineProgressEvent) {
           trace("progressHandler: bytesLoaded=" + event.bytesLoaded + " bytesTotal=" + event.bytesTotal);
    }

    展开全文
  • 用NSOperation写下载队列   说明 1. 支持缓存机制 2. 图片都是主线程加载 3. 文件名用了md5加密 *这东西被人写烂了,但大伙如果对NSOperation不熟悉的话,可以看看本人的实现.   ...

    用NSOperation写下载队列

     

    说明

    1. 支持缓存机制

    2. 图片都是在主线程中加载

    3. 文件名用了md5加密

    *这东西被人写烂了,但大伙如果对NSOperation不熟悉的话,可以看看本人的实现.

     

    源码

    https://github.com/YouXianMing/NSOperationExample

    复制代码
    //
    //  ImageDownloadOperation.h
    //  NSOperationDownloadImage
    //
    //  Created by YouXianMing on 15/9/7.
    //  Copyright (c) 2015年 YouXianMing. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    @class ImageDownloadOperation;
    
    @protocol ImageDownloadOperationDelegate <NSObject>
    
    @required
    - (void)imageDownloadOperation:(ImageDownloadOperation *)operation data:(NSData *)data;
    
    @end
    
    @interface ImageDownloadOperation : NSOperation {
        
        BOOL  _executing;
        BOOL  _finished;
    }
    
    /**
     *  代理
     */
    @property (nonatomic, weak)   id <ImageDownloadOperationDelegate> delegate;
    
    /**
     *  图片地址
     */
    @property (nonatomic, strong) NSString *imageUrlString;
    
    /**
     *  便利构造器
     *
     *  @param urlString 图片地址
     *  @param delegate  代理
     *
     *  @return 实例对象
     */
    + (instancetype)operationWithImageUrlString:(NSString *)urlString
                                       delegate:(id <ImageDownloadOperationDelegate>)delegate;
    
    @end
    复制代码
    复制代码
    //
    //  ImageDownloadOperation.m
    //  NSOperationDownloadImage
    //
    //  Created by YouXianMing on 15/9/7.
    //  Copyright (c) 2015年 YouXianMing. All rights reserved.
    //
    
    #import "ImageDownloadOperation.h"
    #import <CommonCrypto/CommonDigest.h>
    
    @interface ImageDownloadOperation ()
    
    @property (nonatomic, strong) NSURLConnection *connection;
    @property (nonatomic, strong) NSString        *md5String;
    @property (nonatomic, strong) NSString        *filePathString;
    
    @end
    
    @implementation ImageDownloadOperation
    
    - (void)main {
        
        // 验证图片地址是否为空
        if (_imageUrlString.length <= 0) {
            
            [self delegateEventWithData:nil];
            [self completeOperation];
            
            return;
        }
        
        // 生成文件路径
        self.md5String      = [self MD5HashWithString:_imageUrlString];
        self.filePathString = [self pathWithFileName:self.md5String];
        
        // 文件如果存在则直接读取
        BOOL exist = [[NSFileManager defaultManager] fileExistsAtPath:self.filePathString isDirectory:nil];
        if (exist) {
            
            [self delegateEventWithData:[NSData dataWithContentsOfFile:self.filePathString]];
            [self completeOperation];
            
            return;
        }
        
        NSURL        *url     = [NSURL URLWithString:_imageUrlString];
        NSURLRequest *request = [NSURLRequest requestWithURL:url];
        self.connection       = [NSURLConnection connectionWithRequest:request delegate:self];
        
        // 让线程不结束
        do {
            
            @autoreleasepool {
                
                [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];
                
                if (self.isCancelled) {
                    
                    [self completeOperation];
                }
            }
            
        } while (self.isExecuting && self.isFinished == NO);
    }
    
    #pragma mark - 网络代理
    - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    
    }
    
    - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
        
        [self writeData:data toPath:self.filePathString];
        [self delegateEventWithData:data];
    }
    
    - (void)connectionDidFinishLoading:(NSURLConnection *)connection {
        
        [self completeOperation];
    }
    
    - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
        
        [self delegateEventWithData:nil];
        [self completeOperation];
    }
    
    #pragma mark - 
    + (instancetype)operationWithImageUrlString:(NSString *)urlString
                                       delegate:(id <ImageDownloadOperationDelegate>)delegate {
    
        ImageDownloadOperation *operation = [[ImageDownloadOperation alloc] init];
        operation.delegate                = delegate;
        operation.imageUrlString          = urlString;
        
        return operation;
    }
    
    #pragma mark -
    - (void)completeOperation {
        
        [self willChangeValueForKey:@"isFinished"];
        [self willChangeValueForKey:@"isExecuting"];
        _executing = NO;
        _finished  = YES;
        [self didChangeValueForKey:@"isExecuting"];
        [self didChangeValueForKey:@"isFinished"];
    }
    
    - (void)start {
        
        if ([self isCancelled]) {
            
            [self willChangeValueForKey:@"isFinished"];
            _finished = YES;
            [self didChangeValueForKey:@"isFinished"];
            
            return;
        }
        
        [self willChangeValueForKey:@"isExecuting"];
        [NSThread detachNewThreadSelector:@selector(main) toTarget:self withObject:nil];
        _executing = YES;
        [self didChangeValueForKey:@"isExecuting"];
    }
    
    - (BOOL)isExecuting {
        
        return _executing;
    }
    
    - (BOOL)isFinished {
        
        return _finished;
    }
    
    - (BOOL)isConcurrent {
        
        return YES;
    }
    
    #pragma mark -
    - (NSString *)MD5HashWithString:(NSString *)string {
        
        CC_MD5_CTX md5;
        
        CC_MD5_Init(&md5);
        CC_MD5_Update(&md5, [string UTF8String], (CC_LONG) [string length]);
        
        unsigned char digest[CC_MD5_DIGEST_LENGTH];
        CC_MD5_Final(digest, &md5);
        
        NSString *s = [NSString stringWithFormat: @"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
                       digest[0],  digest[1],
                       digest[2],  digest[3],
                       digest[4],  digest[5],
                       digest[6],  digest[7],
                       digest[8],  digest[9],
                       digest[10], digest[11],
                       digest[12], digest[13],
                       digest[14], digest[15]];
        
        return s;
    }
    
    - (NSString *)pathWithFileName:(NSString *)name {
    
        NSString *path = [NSString stringWithFormat:@"/Documents/%@", name];
        return [NSHomeDirectory() stringByAppendingPathComponent:path];
    }
    
    - (void)delegateEventWithData:(NSData *)data {
        
        if (_delegate && [_delegate respondsToSelector:@selector(imageDownloadOperation:data:)]) {
            
            dispatch_async(dispatch_get_main_queue(), ^{
                
                [_delegate imageDownloadOperation:self data:data];
            });
        }
    }
    
    - (void)writeData:(NSData *)data toPath:(NSString *)path {
    
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
            
            [data writeToFile:path atomically:YES];
        });
    }
    
    @end
    复制代码

     

    细节

    展开全文
  • ASINetworkQueue 队列下载

    2015-10-08 15:03:00
    我们通过一个例子介绍一下请求队列使用,我们设计了一个应用,用户点击GO按钮从服务器同时下载两张图片显示画面。 我们直接看看主视图控制器ViewController.h代码如下:#import “ASIHTTPRequest.h”#import ...

    我们通过一个例子介绍一下请求队列使用,我们设计了一个应用,用户点击GO按钮从服务器同时下载两张图片显示在画面中。 


    我们直接看看主视图控制器ViewController.h代码如下: 

    #import “ASIHTTPRequest.h” 

    #import “ASINetworkQueue.h” 

    #import “NSNumber+Message.h” 

    #import “NSString+URLEncoding.h” 



    @interface ViewController : UIViewController 



    @property (weak, nonatomic) IBOutlet UIImageView *imageView1; 

    @property (weak, nonatomic) IBOutlet UIImageView *imageView2; 

    @property (strong) ASINetworkQueue *networkQueue; 



    - (IBAction)onClick:(id)sender; 

    @end 

    我们需要引入ASI框架的两个头文件ASIHTTPRequest.h和ASINetworkQueue.h。其中imageView1和 imageView2是与画面对应的两个图片视图控件。还定义了ASINetworkQueue 类型的networkQueue属性。我们直接看看主视图控制器ViewController.m中点击GO按钮调用方法,代码如下: 

    - (IBAction)onClick:(id)sender { 

    if (!_networkQueue) { 

    _networkQueue = [[ASINetworkQueue alloc] init]; ① 



    // 停止以前的队列 

    [_networkQueue cancelAllOperations]; ② 

    // 创建ASI队列 

    [_networkQueue setDelegate:self]; 

    [_networkQueue setRequestDidFinishSelector:@selector(requestFinished:)]; ③ 

    [_networkQueue setRequestDidFailSelector:@selector(requestFailed:)]; ④ 

    [_networkQueue setQueueDidFinishSelector:@selector(queueFinished:)]; ⑤ 



    for (int i=1; i<3; i++) { 

    NSString *strURL = [[NSString alloc] initWithFormat: 

    @”http://iosbook3/download.php?email=%@&FileName=test%i.jpg”, 

    @”<你的iosbook1.com用户邮箱>”,i]; 

    NSURL *url = [NSURL URLWithString:[strURL URLEncodedString]]; 

    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 

    request.tag = i; ⑥ 

    [_networkQueue addOperation:request]; ⑦ 



    [_networkQueue go]; ⑧ 



    我们再看看它们的回调方法,代码: 

    - (void)requestFinished:(ASIHTTPRequest *)request 



    NSData *data = [request responseData]; 

    NSError *eror; 

    NSDictionary *resDict = [NSJSONSerialization JSONObjectWithData:data 

    options:NSJSONReadingAllowFragments error:&eror]; 

    if (!resDict) { 

    UIImage *img = [UIImage imageWithData:data]; 

    if (request.tag ==1) { ① 

    _imageView1.image = img; 

    } else { 

    _imageView2.image = img; 



    } else { 

    NSNumber *resultCodeObj = [resDict objectForKey:@"ResultCode"]; 

    NSString *errorStr = [resultCodeObj errorMessage]; 

    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@”错误信息” 

    message:errorStr 

    delegate:nil 

    cancelButtonTitle:@”OK” 

    otherButtonTitles: nil]; 

    [alertView show]; 



    if ([_networkQueue requestsCount] == 0) { ② 

    [self setNetworkQueue:nil]; 



    NSLog(@”请求成功”); 



    - (void)requestFailed:(ASIHTTPRequest *)request ③ 



    NSError *error = [request error]; 

    NSLog(@”%@”,[error localizedDescription]); 

    if ([_networkQueue requestsCount] == 0) { 

    [self setNetworkQueue:nil]; 



    NSLog(@”请求失败”); 



    - (void)queueFinished:(ASIHTTPRequest *)request ④ 



    if ([_networkQueue requestsCount] == 0) { 

    [self setNetworkQueue:nil]; 



    NSLog(@”队列完成”); 



    requestFinished:方法是请求对象成功回调方法,因此有两个请求对象它会被调用两次,在第①行代码中我们根据GO按钮点击事件设定的 请求对象的tag属性,来判断是哪个请求对象的回调。进而加载到显示不同的图片视图。第②代码[_networkQueue requestsCount]可以判断队列中请求对象的个数。

     

     

    //其他。。。

    [networkQueueForSong reset];

    //下载队列代理方法

    [networkQueueForSong setRequestDidFailSelector:@selector(singleDownLoadFail:)];

    [networkQueueForSong setRequestDidFinishSelector:@selector(singleDownloadFinished:)];

    [networkQueueForSong setRequestDidReceiveResponseHeadersSelector:@selector(downLoadReceiveResponseHeader:)];

    [networkQueueForSong setRequestDidStartSelector:@selector(singleDownLoadStart:)];

    [networkQueueForSong setQueueDidFinishSelector:@selector(downLoadFinish)];

    [networkQueueForSong setDelegate:self];

    //设置下载队列属性,设置为1只允许下完一首再下另一首,默认是并行下载不分前后

    [networkQueueForSong setMaxConcurrentOperationCount:1];

    转载于:https://www.cnblogs.com/weiboyuan/p/4861101.html

    展开全文
  • 队列在Http请求的一点理解

    千次阅读 2016-11-21 19:23:10
    1.异步队列 (异步消息队列)使用场景: 下载,IM的发消息,当用户发起这些任务之后,可以离开当前页面,任务会后台被执行,至于任务如何返回,可以通过观察者模式 或者 广播接受者2.同步队列顺序检查 任务放在栈...
  • 能否加入下载队列试图下载该资源时给出提示或警告,以免重蹈下载完成后才发现资源变成8秒警告视频的覆辙。:cry: <p><img alt="8sec" src=...
  • 如何springboot项目集成ActiveMq队列 什么是消息队列 1,消息队列,一般我们会简称它为MQ,英文的意思就是Message Queue,列入RubbtyMq、ActiveMq等。 2、消息队列队列先进先出的数据结构,这里我们需要记住栈...
  • 下载队列在Android可以说是非常常见了,常见的做法是将下载任务放到服务,创建线程任务队列,对其进行处理,这样子问题也有很多,比如常见的线程安全之类的。并且考虑到线程创建和关闭对资源的消耗,我们还要...
  • libnet 是一个小型的接口函数库,主要用C语言写成,提供了低层网络数据报的构造、处理和发送功能(百度百科上有...今天无意看到该库的循环队列的实现,感觉真是简洁啊!有木有啊!!! /* Queues. */#define ...
  • DoTween是Unity上的一款动画插件,它使用简单,功能强大,利用它可以很方便地制作一些简单动画。...下载完成后,Unity菜单栏点击Tools->Demigiant->DOTween Utility Panel ,他弹出的窗口点击Se...
  • Relax-and-Recover Relax-and-Recover is the leading Open Source bare metal disaster recovery and system migration solution....ready-to-go workflows for common situations. ...Relax-and-Recover produces ...
  • 打开IDM下载器,单击菜单的“队列”,可以看到左侧有2个主要队列:下载队列和同步队列,如图1。 图 1:队列按钮 大家还可以创建任意数量的附加队列。 选中“队列”,单击右键,选择“创建新队列”,如图2。 ...
  • ASIHTTPRequest是一个很常见的网络请求开源框架,虽然博主声明已经不更新,但目前来看...ASINetworkQueue是下载队列,里面添加很多的单独的ASIHTTPRequest下载任务,可以更好的管理多个下载请求。 这里记录ASIHTTPRe
  • DoTween是Unity上的一款动画插件,它使用简单,功能强大,利用它可以很方便地制作一些简单动画。...下载完成后,Unity菜单栏点击Tools->Demigiant->DOTween Utility Panel ,他弹出的窗口点击Setup D...
  • 开发中遇到这样一个需求。...2.收到用户请求创建一个下载任务,放在任务队列中。 3.web.xml中设置一个监听类,启动一个线程定时扫描任务队列,当有任务时执行任务。 4.执行任务时设置FutureTask超时时间...
  • 一、安装过程 1、下载libevent-2.0.12-stable,并编译安装wget http://httpsqs.googlecode.com/files/libevent-2.0.12-stable.tar.gz tar zxvf libevent-2.0.12-stable.tar.gz cd libevent-2.0.12-stable/ ./confi...
  • 递归操作内存的原理其实就是一个堆栈的过程,而栈结构的特点是“先进后出”,这与队列的“先进先出”的特性是截然相反的。 一般的,文件上传和下载需用到递归操作,它可以纵向遍历指定好的某个资源目录,然后把...
  • 下载宏文件【md5宏】 下载附件,解压,得md5宏.xla md5宏.zip 加载宏 依次打开【文件】-【选项】-【自定义功能区】 选中【开发工具】 这样Excel顶部就多了一栏【开发工具】 选择【加载项】-【浏览】-...
  • 配套的代码可以从本号的github下载,...也就是当线程A期望做某件事,但自己由不想做,或者不能做的情况下,它可以将该事情(工作 work)加入到一个队列当中,然后有后台线程会从队列中获取该工作,并执行该工作。...
  • ASIHTTPRequest是一个很常见的网络请求开源框架,虽然博主声明已经不更新,但目前来看...ASINetworkQueue是下载队列,里面添加很多的单独的ASIHTTPRequest下载任务,可以更好的管理多个下载请求。 这里记录ASIHTTPRe
  • TechDreamer)头图 | CSDN下载自视觉中国队列的概念首先我们联想一下链表,单链表,我们只能对他的链表表尾进行插入,对链表的表头进行结点的删除,这样强限制性的链表,就是我们所说的队列。也就是说,队列...
  • 配套的代码可以从本号的github下载: https://github.com/shuningzhang/linux_kernel 内核相关电子书可以这里下载: https://u19702000.ctfile.com/dir/19702000-33344559-0b7371/等待队列是一种基于资源状态的...
  • jdk有一个接口Queue 它有一个实现类叫LinkedList它其时就是一个队列。 如果要使用队列,插入 offer 获取使用 poll 使用队列来优化递归操作:是可以解决目录层次过多问题。 因为:递归操作可以理解成是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,750
精华内容 700
关键字:

在下载队列中