Încerc să actualizez valoarea progresului de descărcare a fișierelor multiple la UIProgressView pe o celulă de tabel. Am clasa FileDownloader care are NSOperationQueue care face operațiuni de descărcare asincrone. Mă gândesc să actualizez interfața de utilizare folosind un „delegat” din clasa FileDownloader. Dar nu pot compila codurile. Am FileDownloader ca Singleton. Mă întreb dacă îmi lipsește să înțeleg ceva fundamental.
Mai jos este configurarea codului.
FileDownloader.h
#import < Foundation/Foundation.h >
// declare protocol to accept progress status of file downloads
@protocol FileDownloaderDelegate < NSObject >
// this function will update the progressview and re-display the cell
- (void) updateProgessWithCurrentValue:(NSNumber*)value totalValue:(NSNumber*)totalValue;
@end
@interface FileDownloader : NSObject {
NSOperationQueue *operationQueue; // for file download operations
id < FileDownloaderDelegate > delegate; // to send progess value to UI
}
@property (nonatomic, retain) NSOperationQueue *operationQueue;
@property (nonatomic, assign) id < FileDownloaderDelegate > delegate;
+(FileDownloader*) sharedInstance; // FileDownloader is Singleton with its standard methods
// when download is progressing, the delegate function will be called like
// [self.delegate updateProgessWithCurrentValue:10 totalValue:100];
//
@end
MyTableViewCell.h
#import < UIKit/UIKit.h >
#import < FileDownloader.h >
@interface MyTableViewCell : UITableViewCell < FileDownloaderDelegate > {
UIProgressView *progressView;
}
@property (nonatomic, retain) UIProgressView *progressView;
// MyTableViewCell.m will have the implementation of
// - (void) updateProgessWithCurrentValue:(NSNumber*)value totalValue:(NSNumber*)totalValue;
// to update UI
@end
În primul rând, am primit eroarea de compilare „nu pot găsi declarația de protocol pentru FileDownloaderDelegate” în MyTableViewCell. Așa că am mutat declarația de protocol a FileDownloaderDelegate într-un fișier .h separat pentru a putea compila. Chiar și atunci, încă nu pot aloca delegatului din tableViewController folosind
[[FileDownloader sharedInstance] setDelegate:myTableViewCell];
Am primit avertismentul „FileDownloader poate să nu răspundă la metoda setDelegate”, adică nu cunoaște delegatul (deși am „@synthesize delegat”). Mă întreb dacă nu înțeleg ceva despre utilizarea singletonului sau a delegatului.