2014-01-11 2 views
0

Я пытаюсь загрузить набор изображений из веб-службы в UICollectionView, и я использую MKNetworkKit для обработки сетевых операций.MKNetworkEngine не запускает его методы

Это немного странная проблема, потому что она работает в одном сценарии и не в другом. Пожалуйста, не стесняйтесь со мной, это немного длинный пост.

У меня есть простой раскадровки приложение с UIViewController с UICollectionView вложенной в качестве главного вида (не может использовать UICollectionViewController из-за изменения пользовательского интерфейса я буду делать позже).

Я создал класс, который является подклассом MKNetworkEngine, чтобы обработать метод для получения изображений из веб-службы.

ImageEngine.h

#import "MKNetworkEngine.h" 

@interface ImageEngine : MKNetworkEngine 

typedef void (^ImagesResponseBlock)(NSMutableArray *imageURLs); 

- (void)allImages:(ImagesResponseBlock)imageURLBlock errorHandler:(MKNKErrorBlock)errorBlock; 

@end 

ImageEngine.m

#import "ImageEngine.h" 

@implementation ImageEngine 

- (void)allImages:(ImagesResponseBlock)imageURLBlock errorHandler:(MKNKErrorBlock)errorBlock 
{ 
    MKNetworkOperation *op = [self operationWithPath:@"All_Images.php"]; 

    [op addCompletionHandler:^(MKNetworkOperation *completedOperation) { 
     [completedOperation responseJSONWithCompletionHandler:^(id jsonObject) { 
      imageURLBlock(jsonObject[@"Images"]); 
     }]; 
    } errorHandler:^(MKNetworkOperation *completedOperation, NSError *error) { 
     errorBlock(error); 
    }]; 
    [self enqueueOperation:op]; 
} 

- (NSString *)cacheDirectoryName 
{ 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = paths[0]; 
    NSString *cacheDirectoryName = [documentsDirectory stringByAppendingPathComponent:@"SomeImages"]; 

    return cacheDirectoryName; 
} 

@end 

В представлении класса контроллера с точки зрения сбора,

#import "AppDelegate.h" 
#import "GridViewController.h" 
#import "ImageCell.h" 

@interface GridViewController() <UICollectionViewDelegate, UICollectionViewDataSource> 

@property (strong, nonatomic) IBOutlet UICollectionView *collectionView; 
@property (strong, nonatomic) NSMutableArray *images; 
@property (strong, nonatomic) NSString *selectedImageUrl; 

@end 

@implementation GridViewController 


- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    [ApplicationDelegate.imageEngine allImages:^(NSMutableArray *images) { 
     self.images = images; 
     [self.collectionView reloadData]; 
    } errorHandler:^(NSError *error) { 
     NSLog(@"MKNetwork Error: %@", error.localizedDescription); 
    }]; 
} 

#pragma mark - UICollectionViewDataSource 
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section 
{ 
    return self.images.count; 
} 

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 
    ImageCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:CellIdentifier forIndexPath:indexPath]; 

    NSDictionary *thisImage = self.images[indexPath.row]; 
    self.selectedImageUrl = [NSString stringWithFormat:@"%@%@", @"http://toonmoodz.osmium.lk/", thisImage[@"image"]]; 
    [cell.imageView setImageFromURL:[NSURL URLWithString:self.selectedImageUrl]]; 

    return cell; 
} 

@end 

Это работает просто отлично. Загрузка изображений, как ожидалось.

Затем я сделал небольшое обновление пользовательского интерфейса для приложения, используя MBPullDownController. Он просто добавляет представление таблицы в виде коллекции. Нет изменений в сетевом коде. Просто новый подкласс MBPullDownController, чтобы вставить представление коллекции и представление таблицы в главный контроллер представления.

Но когда я это делаю, изображения не загружаются вообще. Я поставил точку останова в методах класса ImageEngine, чтобы убедиться, что они уволены, но это никогда не доходит до этого. (Странно, что этот код действительно работал нормально только сегодня утром. Теперь это не так, и я не знаю, почему). Он не вызывает никаких ошибок и предупреждений.

Я загрузил два проекта, демонстрирующих эту проблему, чтобы другим было легче понять. Если кто-нибудь сможет мне помочь, я буду очень благодарен. В последние несколько часов я вытягивал свои волосы.

Source версии правильно работает.

This является источником проекта, который связан с проблемой. (Когда вы запустите его, он отобразит пустой белый вид. Он выглядит как простой вид, но это коллекционный вид. Я загрузил набор локальных изображений, чтобы увидеть, работает ли он и работает ли он)

Спасибо.

+0

Это нормально, чтобы показать чистый вид, потому что есть нет коллекции или «MKNetworkEngine» (по крайней мере, во второй ссылке «с проблемой». – TonyMkenu

+0

Существует вид коллекции. [См.] (http://i.imgur.com/RKHcb8a.png). представления загружаются в контроллер верхнего уровня p с использованием идентификаторов раскадровки. И подкласс «MKNetworkEngine» называется проектом ImageEngine в проекте. – Isuru

+0

@TonyMkenu Oh Wait! Ты прав. Я загрузил неправильный проект. Спасибо, что заметили это. Ссылка обновлена. – Isuru

ответ

1

Когда я установить точку останова в GridViewController в viewDidLoad способе после выполнения po [[UIApplication sharedApplication] valueForKeyPath:@"delegate.imageEngine"] в консоли я вижу, что imageEngine свойство равно нулю.

Похоже, что application:didFinishLaunchingWithOptions выполняется после viewDidLoad в GridViewController.

я удалил эти две строки из вашего application:didFinishLaunchingWithOptions:

self.imageEngine = [[ImageEngine alloc] initWithHostName:@"toonmoodz.osmium.lk"]; 
[self.imageEngine useCache]; 

Затем я добавил imageEngine ленивый загрузчик AppDelegate и его работы http://cl.ly/image/1S172D2e050J

- (ImageEngine*) imageEngine { 
    if (_imageEngine == nil) { 
     _imageEngine = [[ImageEngine alloc] initWithHostName:@"toonmoodz.osmium.lk"]; 
     [_imageEngine useCache]; 
    } 
    return _imageEngine; 
} 
+0

Спасибо, luleq. Ваше решение работает! Я также нашел другой метод. Я переместил часть кода внутри 'viewDidLoad' в' viewWillAppear', и теперь он отлично работает. Спасибо, что нашли время, чтобы решить это :) – Isuru

Смежные вопросы