निम्नलिखित खेल का मैदान कोड को देखने का तरीका यह है कि वहाँ कोई एक BlockOperation
उपवर्ग उदाहरण और इसके निष्पादन ब्लॉक के बीच चक्र को बनाए रखने है पता चलता मैं रद्द करने योग्य ब्लॉक चाहता था कि मेरे UICollectionViewController
कोशिकाओं को स्क्रॉल किए जाने के बाद आसानी से रद्द कर दिया जा सके स्क्रीन से बाहर। ब्लॉक नेटवर्क ओप नहीं कर रहे हैं, वे छवि संचालन कर रहे हैं (आकार बदलना, फसल आदि)। ब्लॉक को स्वयं को जांचने का संदर्भ होना चाहिए कि क्या उनके सेशन को रद्द कर दिया गया है, और अन्य उत्तरों में से कोई भी नहीं (जब मैंने इसे लिखा था) प्रदान किया।
यहाँ क्या मुझे (स्विफ्ट 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
}
}
बहुत उपयोगी! आपके पास एक टाइपो है, यद्यपि: रद्द किया जाना चाहिए रद्द किया गया – hsdev
फिक्स्ड! धन्यवाद। मेरे पास कोडरनर अब भविष्य में इन शर्मिंदगी से बचाने के लिए है ;-) – jemmons
क्या इस कार्यान्वयन में कोई बग नहीं है? जब कमजोर हो जाता है तो ऑपरेशन शून्य हो जाता है, क्या यह लूपिंग जारी रखने की कोशिश नहीं करेगा? i.e.! nil == सच। लूप की स्थिति नहीं होनी चाहिए (कमजोर ऑपरेशन &&! [कमजोर ऑपरेशन रद्द है])? –