Wie man einem Block ein zusätzliches Argument hinzufügt
Mailcore hat eine cooleMethode Das lädt einen Anhang herunter und akzeptiert einen Block als Parameter, um den Download-Fortschritt zurückzugeben:
- (CTCoreAttachment *)fetchFullAttachmentWithProgress:(CTProgressBlock)block;
Wobei CTProgressBlock definiert ist als
typedef void (^CTProgressBlock)(size_t curr, size_t max);
also normalerweise würde ich es so benutzen:
//AttachmentDownloader.m
int fileNum = x; // explained later
CTCoreAttachment* fullAttachment =
[attachment fetchFullAttachmentWithProgress:^(size_t curr, size_t max) {
NSLog(@"::: this is curr: %zu", curr);
NSLog(@"::: this is max: %zu\n\n", max);
}];
Das Problem ist, dass diese letzte Methode von meiner Haupt-UI-Klasse aufgerufen wirdFileBucket.m
Diese Klasse ruft wiederum viele Anhänge für viele verschiedene UI-Elemente nacheinander ab. Ich möchte, dass diese Rückrufmethode zurückgemeldet wirdFileBucket.m
Zu welchem Anhang gehört dieser Fortschritt? Mit anderen Worten, ich möchte etwas im Sinne von:
// FileBucket.m
[AttachmentDownloader runMultiple:attachmentTree
withProgress:^(size_t curr, size_t max, int fileNum) {
NSLog(@"::: this is curr: %zu", curr);
NSLog(@"::: this is max: %zu\n\n", max);
NSLog(@"::: this progress belongs to element %d", fileNum);
}];
Ich weiß, das ist schwer zu erklären / zu veranschaulichen. Eine zusätzliche Sache:AttachmentDownloader.m
ist sich bewusst, um welchen Eigensinn es bei diesem Fortschritt geht, aber er möchte ihn nur zurückgebenFileBucket.m
jedes Mal Der Callback-Block wird aufgerufen.