Tôi muốn có các khối có thể hủy mà UICollectionViewController
của tôi có thể dễ dàng hủy khi các ô được cuộn tắt màn hình. Các khối không làm ops mạng, họ đang làm các hoạt động hình ảnh (thay đổi kích thước, cắt xén, vv). Các khối chính họ cần phải có một tham chiếu để kiểm tra xem op của họ đã bị hủy bỏ, và không ai trong số các câu trả lời khác (tại thời điểm tôi đã viết này) với điều kiện đó.
Đây là những gì làm việc cho tôi (Swift 3) - làm cho khối mà phải mất một ref yếu đến BlockOperation
, sau đó gói chúng trong BlockOperation
khối chính nó:
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
}
}
Sử dụng nó trong UICollectionViewController
tôi:
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()
}
}
Hoàn thành bức tranh:
class Weak<T: AnyObject> {
weak var value : T?
init (value: T) {
self.value = value
}
}
Rất hữu ích! Bạn có lỗi chính tả: isCanceled phải là isCancelled – hsdev
Đã sửa lỗi! Cảm ơn. Tôi có CodeRunner bây giờ để cứu tôi khỏi những điều xấu hổ này trong tương lai ;-) – jemmons
Không có lỗi trong quá trình thực hiện này? Khi weakOperation trở thành nil sẽ không cố gắng tiếp tục lặp? tức là! nil == đúng. Điều kiện vòng lặp không nên trong khi (weakOperation &&! [WeakOperation isCancelled])? –