在 iOS SWIFT 2 中取消获取请求 [关闭]

Posted

技术标签:

【中文标题】在 iOS SWIFT 2 中取消获取请求 [关闭]【英文标题】:Cancel fetch request in iOS SWIFT 2 [closed] 【发布时间】:2015-11-07 14:40:16 【问题描述】:

我想在我的应用程序中使用核心数据。但是我想实现一个可以处理数据库的管理器,我不知道如何取消之前的获取请求。我尝试了一些技术,但没有奏效。

所以这些是我的任务:

从核心数据中获取 如果我开始新的提取,请取消之前的提取 在后台线程中执行这些操作

总结:如何取消核心数据获取请求?

【问题讨论】:

【参考方案1】:

我的建议?从观看今年 WWDC 的 Advanced NSOperations 视频开始。另请查看视频下的资源和成绩单链接。很多关于多任务处理的好信息。

【讨论】:

是的,这是我唯一没有尝试操作队列的,所以你认为我应该尝试吗?我的意思是我可以取消之前的获取请求并开始一个新的请求?【参考方案2】:

我将您的问题更多地解释为如何取消待处理的核心数据请求,而不是任何特定于 swift 语法的内容。因此,这个例子是在 ObjectiveC 中的,但是你可以很容易地翻译它。

一旦向核心数据发出正常的获取请求,就无法取消它。您必须等待它完成。

但是,您可以取消异步获取请求(即那些使用 NSAsynchronousFetchRequest 发起的请求)。

如果您使用NSOperation 将您的操作排队,您可以取消任何挂起的操作,但您仍然无法取消当前正在运行的任何操作。

但是,没有理由仅仅为此将您的所有代码移植到NSOperation,因为您可以通过多种方式自己实现类似的东西。这是NSManagedObjectContext上的一个类别选项...

- (void)performCancelableBlock:(void(^)(void))block 
    [self performBlock:^
        if (block) 
            NSUInteger count = [objc_getAssociatedObject(self, @selector(cancelPendingBlocks)) unsignedIntegerValue];
            if (count == 0) 
                block();
            
        
    ];


- (void)cancelPendingBlocks 
    @synchronized(self) 
        NSUInteger count = [objc_getAssociatedObject(self, _cmd) unsignedIntegerValue];
        NSAssert(count+1 > 0, @"count has wrapped; queue is probably hung");
        objc_setAssociatedObject(self, _cmd, @(count+1), OBJC_ASSOCIATION_RETAIN);
    
    [self performBlock:^
        @synchronized(self) 
            NSUInteger count = [objc_getAssociatedObject(self, _cmd) unsignedIntegerValue];
            NSAssert(count > 0, @"BUG - cancel count has become unbalanced");
            objc_setAssociatedObject(self, _cmd, @(count-1), OBJC_ASSOCIATION_RETAIN);
        
    ];

还有一个简单的测试来证明它的作用......

- (void)testCancelation 
    NSManagedObjectContext *moc = [self makeMOC];

    // Expect that the original block ran to completion and didn't get "interrupted"
    XCTestExpectation *origExpectation = [self expectationWithDescription:@"Original block"];
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
    [moc performBlock:^
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        [origExpectation fulfill];
    ];
    NSUInteger __block normalBlockCount = 0, cancelBlockCount = 0;
    for (int i = 0; i < 100; ++i) 
        [moc performBlock:^
            ++normalBlockCount;
        ];
        [moc performCancelableBlock:^
            ++cancelBlockCount;
        ];
    
    [moc cancelPendingBlocks];

    // Expect that only blocks in the queue when the cancel request was issued are canceled
    XCTestExpectation *doneExpectation = [self expectationWithDescription:@"Cancelable block after cancelation"];
    [moc performCancelableBlock:^
        [doneExpectation fulfill];
    ];
    dispatch_semaphore_signal(semaphore);

    [self waitForExpectationsWithTimeout:10 handler:nil];
    XCTAssertEqual(100, normalBlockCount);
    XCTAssertEqual(0, cancelBlockCount);

【讨论】:

以上是关于在 iOS SWIFT 2 中取消获取请求 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

swift iOS - AFNetworking扩展 - 使用网址取消请求,需要https://gist.github.com/danielgomezrico/ae53fae471168dde6c

swift iOS - AFNetworking扩展 - 使用网址取消请求,需要https://gist.github.com/danielgomezrico/ae53fae471168dde6c

swift iOS - AFNetworking扩展 - 使用网址取消请求,需要https://gist.github.com/danielgomezrico/ae53fae471168dde6c

swift iOS - AFNetworking扩展 - 使用网址取消请求,需要https://gist.github.com/danielgomezrico/ae53fae471168dde6c

swift iOS - AFNetworking扩展 - 使用网址取消请求,需要https://gist.github.com/danielgomezrico/ae53fae471168dde6c

swift iOS - AFNetworking扩展 - 使用网址取消请求,需要https://gist.github.com/danielgomezrico/ae53fae471168dde6c