【问题标题】:NSOperation - setMaxConcurrentOperationCountNSOperation - setMaxConcurrentOperationCount
【发布时间】:2014-05-31 08:31:25
【问题描述】:

我正在为网络请求创建一个类,比如 NetworkManager,它是一个单例。我希望这个类来处理网络请求。

我有两个NSOperationQueues,一个用于并行请求,我没有设置并发数Operations。对于顺序队列,将 setMaxConcurrentOperationCount 设置为 1。我想,第二个NSOperation 请求将在第一个请求执行结束后执行。它只运行第一个NSOperation,它处理网络请求。如果我必须按顺序处理请求,应该怎么做。下面是示例代码:

NSOperation *networkOperation = [[NetworkOperation alloc]initWithRequest:request networkRequest:networkRequest];
    if(!sequentialQueue){
        sequentialQueue = [[NSOperationQueue alloc]init];

        [sequentialQueue setMaxConcurrentOperationCount:1];
    }

    [sequentialQueue addOperation:networkOperation];

请帮忙。

【问题讨论】:

    标签: ios nsoperation nsoperationqueue


    【解决方案1】:

    您可以像这样子类化 NSOperationQueue 并覆盖 - addOperation: 方法。

    - (void)addOperation:(NSOperation *)operation {
    
        // check whether the queue has at least one operation, you can also check for nil
        if ([[self operations] count] > 0) [operation addDependency:[self.operations lastObject]];
    
        [super addOperation:operation];
    }
    

    【讨论】:

    • 谢谢。问题是我已经覆盖了 NSoperation 的 start 方法,但没有调用 [super start]。因此,在我添加它是在没有上述逻辑的情况下按顺序执行之后,当我将 maxcouncurrentoperationCount 设置为 1 时。
    • 我想从你那里得到一些建议。 1)我也想在顺序队列中保持优先级。我该如何实现这个。2)如果必须取消网络请求,函数调用将进入网络管理器类。我如何取消请求,因为在我将它添加到 NSOperationQueue 后没有对操作的引用。对于要取消的请求,传递的参数将是包含 URL 和其他请求相关信息的 NetworkRequest 对象。
    • 嗯...这就是为什么我要求您发布更多代码。好的,对于您的要求,添加依赖项将无济于事,因此请使用 -maxCouncurrentOperationCount。使用 '- (void)setQueuePriority:(NSOperationQueuePriority)priority' 来确定操作的优先级。对于您的第二个问题,只需保留您的操作参考并检查状态并取消它。或者简单地通过比较 NSURLRequest 和 NSURL 来搜索你的操作。但请记住:取消添加的操作并不能保证该操作将被取消。
    • @Goppinath- 如果 maxCouncurrentOperationCount 设置为 1,NSOperationQueue 将如何知道 NSOperation 是否已完成执行。
    • @user694688 - 我再次感到困惑,您可以使用 NSOperationQueue 的“操作”属性,在那里您可以检查每个操作的状态,例如就绪、执行或完成。更多问题请参考 Apple 的精彩文档。
    【解决方案2】:

    你的问题听起来你需要规范你必须使用的操作的顺序,

    - (void)addDependency:(NSOperation *)operation
    

    NSOperation 的方法说嘿你必须在一个特定的操作之后进行操作。举个例子:

    NSOperation *firstOperation = [NSOperation new]; // do your own init
    NSOperation *secoundOperation = [NSOperation new];
    
    [secoundOperation addDependency:firstOperation];
    

    在 firstOperation 之后将保证处理 secoundOperation。如果只设置了--maxConcurrentOperationCount 则无法保证操作的顺序。

    希望对你有所帮助。

    【讨论】:

    • 谢谢。但是,为什么将 maxConcurrentOperationCount 设置为 1 不会在第一个操作完成后执行下一个操作。 NSOperationQueue 不是基于队列的实现吗
    • 您是否将这两个操作都添加到队列中?我看不到它。你能发布更多代码吗?
    • 我现在进行...你是问手术的顺序还是第二次手术失败?
    • 是的,现在添加两个操作进行测试。当我没有设置 maxConcurrentOperationCount 时,我能够注意到两个线程并行执行。
    • 我的问题是,如果我将 maxConcurrentOperations 设置为一个,第二个操作根本不会执行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多