我想要取消塊,我的UICollectionViewController
可以很容易地取消一旦單元格滾動關閉屏幕。這些塊沒有做網絡操作,他們正在做圖像操作(調整大小,裁剪等)。這些塊本身需要有一個引用來檢查他們的操作是否已被取消,而其他答案(在我寫這篇文章的時候)沒有提供。
這裏是爲我工作(SWIFT 3) - 使得該採取弱裁判的BlockOperation
塊,然後包裹他們在BlockOperation
塊本身:
public extension OperationQueue {
func addCancellableBlock(_ block: @escaping (BlockOperation?)->Void) -> BlockOperation {
let op = BlockOperation.init()
weak var opWeak = op
op.addExecutionBlock {
block(opWeak)
}
self.addOperation(op)
return op
}
}
在我UICollectionViewController
使用它:
var ops = [IndexPath:Weak<BlockOperation>]()
func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
...
ops[indexPath] = Weak(value: DispatchQueues.concurrentQueue.addCancellableBlock({ (op) in
cell.setup(obj: photoObj, cellsize: cellsize)
}))
}
func collectionView(_ collectionView: UICollectionView, didEndDisplaying cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
if let weakOp = ops[indexPath], let op: BlockOperation = weakOp.value {
NSLog("GCV: CANCELLING OP FOR INDEXPATH \(indexPath)")
op.cancel()
}
}
完成圖片:
class Weak<T: AnyObject> {
weak var value : T?
init (value: T) {
self.value = value
}
}
非常實用!你有一個錯字,但:isCanceled must is isCancelled – hsdev
Fixed!謝謝。我現在有了CodeRunner來將我從未來的這些尷尬中解救出來;-) – jemmons
這個實現中沒有錯誤嗎?當weakOperation變爲零時,它會不會嘗試繼續循環?即!nil == true。 循環條件不應該是while(weakOperation &&![weakOperation isCancelled])? –