ich meine Bewerbung Ich habe Tabellenansicht mit benutzerdefinierten Zelle, die hat:Anruf NSURLSession Methode aus dem Inneren der Unterklasse von NSOperation
@property (weak, nonatomic) IBOutlet UIImageView *image;
@property (weak, nonatomic) IBOutlet UILabel *nameOfImage;
@property (weak, nonatomic) IBOutlet UIButton *start;
ich asynchron beliebig viele Bilder herunterladen müssen (durch eine Menge Starttasten drücken). Zu diesem Zweck habe ich eine Unterklasse von NSOperation - MyOperationQueue erstellt. Umsetzung sieht es wie folgt aus:
- (id)initWithURL:(NSURL*)url andRaw:(NSInteger)row
{
if (![super init])
return nil;
[self setTargetURL:url];
[self setCurrentCell:row];
self.customCell = [[CustomTableViewCell alloc]init];
self.tableView = [ContentTableView sharedManager];
return self;
}
- (void)main
{
if ([self isCancelled])return;
self.defaultSession = [self configureSession];
NSURLSessionDownloadTask *task = [self.defaultSession downloadTaskWithURL:self.targetURL];
if ([self isCancelled]) return;
[task resume];
}
- (void)cancel
{
self.isCancelled = YES;
if(self.downloadTask.state == NSURLSessionTaskStateRunning)
[self.downloadTask cancel];
}
unter dieser Methoden, die ich auch hier NSURLSession Methoden beschrieben:
- (NSURLSession *) configureSession //it visits it
{
NSURLSession *session = [NSURLSession sessionWithConfiguration:config delegate:self.tableView **delegateQueue:self**]; //self - warning - incompatible pointer type sending "MyOperationQueue" to "NSOperationQueue" _Nullable.
}
-(void)URLSession:(NSURLSession *)session
downloadTask:(NSURLSessionDownloadTask *)downloadTask
didWriteData:(int64_t)bytesWritten
totalBytesWritten:(int64_t)totalBytesWritten
totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite // don't visit
-(void)URLSession:(NSURLSession *)session
downloadTask:(NSURLSessionDownloadTask *)downloadTask
didFinishDownloadingToURL:(NSURL *)location // don't visit
Ich schaffe in Verfahren in Tableview die benutzerdefinierte Warteschlange:
- (void)didClickStartAtIndex:(NSInteger)cellIndex withData:(CustomTableViewCell*)data
{
NSURL *url = [NSURL URLWithString: tmp.imeageURL];
MyOperationQueue * one = [[MyOperationQueue alloc]initWithURL:url andRaw:self.selectedCell];
[self.queue addOperation:one];
}
Die Bild ist überhaupt nicht geladen, die Warteschlange nur in Konfigurationsmethode eingeben und das ist alles. Bitte rate mir, was falsch ist? Vielen Dank im Voraus.
EDIT: Aktualisierung UI:
-(void)URLSession:(NSURLSession *)session
downloadTask:(NSURLSessionDownloadTask *)downloadTask
didFinishDownloadingToURL:(NSURL *)location
{
NSLog(@"didFinishDownloadingToURL - Queue");
NSData *d = [NSData dataWithContentsOfURL:location];
UIImage *im = [UIImage imageWithData:d];
dispatch_async(dispatch_get_main_queue(), ^{
self.customCell.image.image = im;
self.customCell.realProgressStatus.text = @"Downloaded";
[self.tableView.tableView reloadData];
});
}
BTW, in Ihrer 'cancel' Methode möchten Sie wahrscheinlich' [super cancel] 'aufrufen, damit Sie das Standardverhalten' NSOperation' genießen können. Stellen Sie in 'main' sicher, dass Sie die' isFinished' KVO ausführen. Schließlich nehme ich an, dass Sie Ihre 'NSOperation'-Klasse als asynchron definiert haben? – Rob
@Rob, ich habe gerade die Unterklasse davon erstellt, ich habe nie erwähnt, dass es asynchron sein sollte, wo soll ich das tun? – Melany
Ja, es muss asynchron sein, da 'NSURLSession' asynchron ist. Also (a) "isAsynchronous" muss "true" zurückgeben; (b) Sie müssen "isExecuting" und "isFinished" KVO ausführen und haben ähnliche Methoden, die die korrekten Werte zurückgeben. Wenn Sie nach "asynchrone' NSOperation'-Unterklasse "suchen, werden Sie wahrscheinlich viele Treffer für all diese Dinge finden. Sie müssen diese asynchrone Operation jedoch unbedingt vornehmen, da andernfalls die Operation beendet und aufgehoben wird, bevor eine der Delegatmethoden aufgerufen wird. – Rob