0

メソッドが完成したらコードを開始したい。サーバーから画像の配列をロードし、それらの画像を作成したセルのImageViewに追加するUICollectionViewがあります。これは、私のコードです。

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellID = @"cellID";
    insightCell *myCell = (insightCell *)[collectionView dequeueReusableCellWithReuseIdentifier:cellID forIndexPath:indexPath];
    myCell.tag = [[[objectiveGov n_insights] objectAtIndex:indexPath.item]integerValue];
    imgTag = ((UICollectionView *)myCell).tag;
//This is the Method I want to run "ObjectiveGov is the NSObject which has my Method inside "arrayImages" which is separate to the view controller this UICollectionView is in.
    [objectiveGov arrayImages];

//Possible if statement here, that records when the method above is finished.
    myCell.insightImageView.image = [theInsightImage objectAtIndex:indexPath.item];
            return myCell;
        }

したがって、メソッド[objectiveGov arrayImages];が終了したら、を実行する必要がありmyCell.insightImageView.imageます。これを行う方法はありますか?メソッドの最後に投稿するNSNotificationCenterを作成しようとしましたが、UICollectionViewが割り当てられたときにUICollectionViewCellメソッドが開始されるため、これは機能しませんでした。何か案は?ありがとう!

ArrayImagesメソッドコードの編集:

+(void)arrayImages
{
    [[NSNotificationCenter defaultCenter] postNotificationName:@"postArrayImages" object:nil];
    [[NSUserDefaults standardUserDefaults] synchronize];

    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@/api/insights/get/",URL_ROOT]];
    AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:url];
    NSString *imageString = [NSString stringWithFormat:@"%d",[viewInsightViewController imgTag]];
    NSURLRequest *request = [httpClient requestWithMethod:@"GET" path:imageString parameters:nil];
    AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {

        NSDictionary *dictionInsight = [JSON valueForKey:@"results"];
        NSArray *insightArray = [dictionInsight valueForKey:@"images"];
        NSString *fileName = [dictionInsight valueForKey:@"filename"];
        if (fileName == (id) [NSNull null])
        {
//URL incase server file doesnt contain image.
            nineArray = [NSString stringWithFormat:@"http://url.co.uk/images/logo.png"];
        }else {
            nineArray = [insightArray valueForKey:@"96"];
        }
        insightURL = [NSURL URLWithString:nineArray];

         if (insightURL != nil) {
        NSURLRequest *requestImage = [NSURLRequest requestWithURL:insightURL];
        AFImageRequestOperation *imageOperation = [AFImageRequestOperation imageRequestOperationWithRequest:requestImage imageProcessingBlock:nil success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image)
                                                   { 
                                                       if (requestImage != nil) {
                                                           insightImages = image;
                                                           [arrayOfImages addObject:insightImages];                                                      
 }

                                                   } failure:nil];
        [imageOperation start];
         }
4

2 に答える 2

1

ブロックを使用すると、この状況に最適です。配列画像メソッドを次のようなものに変更して、afnetworkingが完了したときに、ロードされた画像を返すブロックを呼び出します。

+ (void)arrayImagesWithCompletionBlock:(void(^)(UIImage *image))completionBlock {
....
       if (insightURL != nil) {
            NSURLRequest *requestImage = [NSURLRequest requestWithURL:insightURL];
            AFImageRequestOperation *imageOperation = [AFImageRequestOperation imageRequestOperationWithRequest:requestImage imageProcessingBlock:nil success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {
                    if (requestImage != nil) {

                       insightImages = image;
                       [arrayOfImages addObject:insightImages];

                       // Call the completion block here once we have the loaded image
                       completionBlock(image);
                    }];

               } failure:nil];

            [imageOperation start];
        }
....
}

そして、cellForIndexPathで次のように呼び出します。

[objectiveGov arrayImagesWithCompletionBlock:^(UIImage *loadedImage) {
    myCell.insightImageView.image = loadedImage;    
}];

最後に、objectForKeyを実際に実行したい場所全体でvalueForKeyを呼び出しています。(valueForKeyは、必要なディクショナリメソッドに対するオブジェクトのプロパティ値を取得します。詳細については、Googleの「キー値コーディング」を参照してください)。

于 2012-11-15T13:00:46.223 に答える
0

多分あなたは条件で行くことができますか?[objectiveGovarrayImages]が終了時にBOOL=YESを返すようにします。

NSCondition *condition = [NSCondition new];
__block BOOL continueThread = NO;

        if ([objectiveGov arrayImages] == YES) {
            continueThread = YES;
            [condition signal];
            [condition unlock];
        } 

while (!continueThread) [condition wait];

それがうまくいくかどうかわからない..ただ大声で考えて...

于 2012-11-15T12:30:47.640 に答える