2014-01-11 30 views
0

我試圖將一組圖像從Web服務加載到UICollectionView,我正在使用MKNetworkKit來處理網絡操作。MKNetworkEngine不會觸發其方法

這是一個奇怪的問題,因爲它在一種情況下工作,而不在另一種情況下。請耐心等待,這是一個很長的帖子。

我有嵌入作爲其主視圖中UICollectionView一個UIViewController一個簡單的故事板的應用程序(無法使用UICollectionViewController由於UI的改變,我該怎麼辦後)。

我已經創建了一個類MKNetworkEngine的子類來處理從Web服務中檢索圖像的方法。

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做了一個小的UI升級到應用程序。它只是在集合視圖下添加一個表視圖。沒有更改網絡代碼。只需要一個新的子類MBPullDownController即可將集合視圖和表格視圖嵌入到主視圖控制器中。

但是,當我這樣做,圖像根本不加載。我在ImageEngine類的方法內部放置了一個斷點,以查看它們是否被解僱,但從來沒有涉及到這一點。 (奇怪的是,這個代碼實際上在今天早上運行的很好,現在不行,我完全不知道爲什麼)。它不會拋出任何錯誤或警告。

我已經上傳了兩個項目來演示這個問題,以便其他人更容易理解。如果有人能幫助我,我會很感激。在過去的幾個小時裏,我一直拉着我的頭髮。

Source的版本是正常工作

This是與該問題的項目的來源。 ()當你運行它時,它會顯示一個空白的白色視圖,它看起來像一個普通的視圖,但它是收集視圖,我加載了一組本地圖像,看看它的工作和它是否

謝謝。

+0

這是正常的顯示空白的觀點,因爲有沒有收集視圖或一個「MKNetworkEngine」(至少在第二個鏈接「的問題」 – TonyMkenu

+0

有一個集合視圖[見](http://i.imgur.com/RKHcb8a.png)。視圖被加載到頂部視圖控制器p中以編程方式使用故事板ID。而MKNetworkEngine的子類在項目中稱爲ImageEngine。 – Isuru

+0

@TonyMkenu哦等等!你是對的。我上傳了一個錯誤的項目。感謝您注意到這一點。鏈接已更新。 – Isuru

回答

1

當我在viewDidLoad方法設置在GridViewController斷點,在控制檯執行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