Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/102.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何管理AFNetworking上的活动操作(AFDownloadRequestOperation)_Ios_Http_Afnetworking_Objective C Blocks_Nsoperation - Fatal编程技术网

Ios 如何管理AFNetworking上的活动操作(AFDownloadRequestOperation)

Ios 如何管理AFNetworking上的活动操作(AFDownloadRequestOperation),ios,http,afnetworking,objective-c-blocks,nsoperation,Ios,Http,Afnetworking,Objective C Blocks,Nsoperation,我从iOS开始,尝试编写一个简单的文件下载程序,带有webview 我需要下载多个文件,但不能同时调用(就像我看到的示例);它应该像一个桌面浏览器:它应该能够添加一个新的操作,同时浏览,在任何时候,不是所有的下载在一行 在阅读和阅读之后,我发现了afnetworking,我一直在尝试实现它,但没有取得好的效果。。。因为我不知道如何管理多个操作 我的问题是,一旦我添加了许多操作,如何单独调用它们?例如,仅停止或取消其中一个 代码如下: ... AFHTTPClient *httpClien

我从iOS开始,尝试编写一个简单的文件下载程序,带有webview

我需要下载多个文件,但不能同时调用(就像我看到的示例);它应该像一个桌面浏览器:它应该能够添加一个新的操作,同时浏览,在任何时候,不是所有的下载在一行

在阅读和阅读之后,我发现了afnetworking,我一直在尝试实现它,但没有取得好的效果。。。因为我不知道如何管理多个操作

我的问题是,一旦我添加了许多操作,如何单独调用它们?例如,仅停止或取消其中一个

代码如下:

...
    AFHTTPClient *httpClient;
...


- (void)DownloadFileFromUrl:(NSString *)fileURL{

        NSURL *url = [NSURL URLWithString:fileURL];
        NSURLRequest *request = [NSURLRequest requestWithURL:url];

     //I've tried to init httpClient here each time, or at didLoad with a nil baseurl

     httpClient =[[AFHTTPClient alloc]initWithBaseURL: [NSURL URLWithString:@"fileURL"]];
    [httpClient.operationQueue setMaxConcurrentOperationCount:10];

    AFDownloadRequestOperation *operation = [[AFDownloadRequestOperation alloc] initWithRequest:request
                                                                                     targetPath:targetPath
                                                                                   shouldResume:YES];


        [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {

            //COOL!

        } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
            //failure case


            //remove the file if saved a part of it!
            NSFileManager *fileManager = [NSFileManager defaultManager];
            [fileManager removeItemAtPath:targetPath error:&error];

            if (error) {

                //ERROR

            }

            if ([operation isCancelled]) {



            }
        }];

    [operation setProgressiveDownloadProgressBlock:^(AFDownloadRequestOperation *operation1, NSInteger bytesRead, long long totalBytesRead, long long totalBytesExpected, long long totalBytesReadForFile, long long totalBytesExpectedToReadForFile)
     {



            if (totalBytesExpectedToReadForFile > 0) {
            dispatch_async(dispatch_get_main_queue(), ^{


                //NSLog(@"Operation%i: bytesRead: %d", 1, bytesRead);
                //NSLog(@"Operation%i: totalBytesRead: %lld", 1, totalBytesRead);
                //NSLog(@"Operation%i: totalBytesExpected: %lld", 1, totalBytesExpected);
                //NSLog(@"Operation%i: totalBytesReadForFile: %lld", 1, totalBytesReadForFile);
                //NSLog(@"Operation%i: totalBytesExpectedToReadForFile: %lld", 1, totalBytesExpectedToReadForFile);



            });
        }

     }];


       [httpClient.operationQueue addOperation:operation];
        //OR ?[httpClient enqueueHTTPRequestOperation:operation];


}
当我只下载一个文件时,一切似乎都正常,因为调用httpClient.operationQueue.operations[0]。。。我得到了它的数据,但我不能从任何地方执行[[httpClient.operationQueue.operations[0]]暂停]

但是,如果我尝试从另一个站点下载第二个文件(我有一个要导航的webview),并将其添加到httpClient.operationQueue,它似乎不会将其添加到同一个队列;我是说,如果我用定时器打电话:

NSLog(@"Operations %d", httpClient.operationQueue.operations.count);
我没有“操作2”,但是:

这很烦人,因为有时当我试图获得操作时,为了找到我想要的操作并对其进行处理,我没有找到它!它是在一个“平行”队列或什么

有没有办法获取和处理所有活动操作?还是每次添加一个操作时将每个操作存储在某种数组上的方法?(但能够“使用它们”,而不是只读目的..如呼叫暂停、取消等)

很明显,我遗漏了一些重要的东西,而且我是一个编程新手,但是任何帮助都将不胜感激!(如果你能直截了当地说,请说得更好……我是初学者)

非常感谢,真的

编辑: 在做了一些研究并尝试了一些事情之后,我已经解决了这个问题,将httpclient添加到一个单例中,并且只在应用程序初始化时使用一个随机的baseurl设置它。然后,我将每个操作添加到该单例httpClient,而不管其url如何。这似乎是可行的,因为现在它存储了所有的连接,我可以访问它们,但我知道这不是一个好方法;在cleaner上必须更容易,我知道我缺少了在某种数组中管理活动连接的方法,而不是使用一个“棘手的”httpclient,所有操作都使用假baseurl(使用不同的URL)
所以我仍然在接受建议和良好实践:)。谢谢

好的,在动手之前先给点提示。 我强烈建议您阅读NSOperationQueue和NSOperation API文档:

NSOperationQueue:

NSO操作:

我不鼓励您尝试迭代NSOperationQueue的操作数组。为什么?因为它很高,你可能会以比赛条件问题结束

不过。我建议你采取以下方法:

1) 在singleton类中创建NSDictionary,其中: 键:将表示文件名 值:与该请求关联的AFDownloadRequestOperation请求

2) 需要下载新文件时: 验证字典中是否存在,如果不创建新操作,请将其添加到字典中

2.1)如果确实存在,您可能需要:
2.1.1)由于AFDownloadRequestOperation从NSOperation扩展而来,您可以取消它。要执行此操作,必须先检查以下条件:isExecuting,isFinished。如果这些条件中的任何一个为假,您可以取消该操作并将其从字典中删除。

好的,在开始之前提供一些提示。 我强烈建议您阅读NSOperationQueue和NSOperation API文档:

NSOperationQueue:

NSO操作:

我不鼓励您尝试迭代NSOperationQueue的操作数组。为什么?因为它很高,你可能会以比赛条件问题结束

不过。我建议你采取以下方法:

1) 在singleton类中创建NSDictionary,其中: 键:将表示文件名 值:与该请求关联的AFDownloadRequestOperation请求

2) 需要下载新文件时: 验证字典中是否存在,如果不创建新操作,请将其添加到字典中

2.1)如果确实存在,您可能需要:
2.1.1)由于AFDownloadRequestOperation从NSOperation扩展而来,您可以取消它。要执行此操作,必须先检查以下条件:isExecuting,isFinished。如果其中任何一个条件为false,您可以取消该操作并将其从字典中删除。

@user1450188这对您有帮助吗?@user1450188这对您有帮助吗?
Operations 1
Operations 1