在 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