0

ビューでは、コアデータからフェッチしている画像を表示しています。カルーセル クラスを使用して表示している画像です。同じビューに、別の画面に移動する Facebook ボタンがあります。Facebook ボタンをクリックするとアクションが実行されず、画像がロードされた後、次の画面のみが表示され、クリックしてもすぐにボタン アクションが呼び出されません。

viewDidLoad で私は呼び出しました:

[self performSelectorInBackground:@selector(popularImages) withObject:nil];

PopularImages メソッド:

- (void)popularImages
{
    NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Deals"];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ispopular == 1"];
    [request setPredicate:predicate];
    NSLog(@"popular Hypes called");
    [self.managedObjectContext executeFetchRequest:request returnManagedObjectIDs:NO onSuccess:^(NSArray *deals) {
        deals123 = [[NSMutableArray alloc] initWithArray:deals];
        ij = 1;

        for (Deals *deals in deals123) {
            customizedMessage = [deals valueForKeyPath:@"txtmsgrec"];
            dealIdString = [deals valueForKeyPath:@"dealsId"];
            descriptionStr = [deals valueForKeyPath:@"dealdescription"];
            captionStrArray = [deals valueForKeyPath:@"dealsassets.caption"];

            [customizedMessageDict setObject:customizedMessage forKey:[NSString stringWithFormat:@"dealid%d",ij]];
            [dealDict setObject:customizedMessageDict forKey:@"dealsmessage"];

            [dealsIdDict setObject:dealIdString forKey:[NSString stringWithFormat:@"dealid%d",ij]];
            [dealDict setObject:dealsIdDict forKey:@"dealsId"];

            NSDictionary *dict = [NSDictionary dictionaryWithObject:captionStrArray forKey:@"caption"];
            NSArray *captionTemparr = [[dict objectForKey:@"caption"] allObjects];

            NSArray *assets = [deals valueForKeyPath:@"dealsassets.dealassetid"];
            NSDictionary *dealassetidDict = [NSDictionary dictionaryWithObject:assets forKey:@"dealassetid"];
            NSArray *dealassetidTemparr = [[dealassetidDict objectForKey:@"dealassetid"] allObjects];

            [dealsUrlDict setObject:[[dealassetidDict objectForKey:@"dealassetid"] allObjects] forKey:[NSString stringWithFormat:@"dealid%d",ij]];
            [dealDict setObject:dealsUrlDict forKey:@"delasURL"];
            [dealsdescriptionDict setObject:descriptionStr forKey:[NSString stringWithFormat:@"dealid%d",ij]];
            [dealDict setObject:dealsdescriptionDict forKey:@"dealsDescription"];
            [dealscaptionDict setObject:captionTemparr forKey:[NSString stringWithFormat:@"dealid%d",ij]];
            [dealDict setObject:dealscaptionDict forKey:@"dealscaption"];

            ij++;
        }        
        NSArray *array = [[dealDict valueForKey:@"delasURL"]allKeys];
        NSLog(@"allKeys]class %@",[[[dealDict valueForKey:@"delasURL"]allKeys]class]);
        NSDictionary *dealurlDict = [dealDict valueForKey:@"delasURL"];
        NSDictionary *dealDescDict = [dealDict valueForKey:@"dealsDescription"];
        NSDictionary *dealCaptionDict = [dealDict valueForKey:@"dealscaption"];
        NSDictionary *dealIDDict = [dealDict valueForKey:@"dealsId"];
        NSDictionary *dealMessageDict = [dealDict valueForKey:@"dealsmessage"];

        for(int i=0;i<[array count];i++)
        {
            NSString *keyvalue = (NSString *)[array objectAtIndex:i];
            NSString *dealId = [dealIDDict valueForKey:keyvalue];
            NSArray *dealUrl = [dealurlDict valueForKey:keyvalue];
            NSString *dealdesc = [dealDescDict valueForKey:keyvalue];
            NSArray *dealcaption = [dealCaptionDict valueForKey:keyvalue];
            NSString *dealMessage = [dealMessageDict valueForKey:keyvalue];

            if([dealUrl count] == [dealcaption count])
            {
                //[dealUrl enumerateObjectsUsingBlock:^(id obj,NSUInteger idx,BOOL *stop)
                for(int j = 0; j<[dealUrl count]; j++)
                {
                    PopularHypesModal *dobject = [[PopularHypesModal alloc]init];
                    dobject.dealsID = dealId;
                    dobject.dealDescription = dealdesc;
                    dobject.dealcaption = [dealcaption objectAtIndex:j];
                    dobject.dealsUrl = [dealUrl objectAtIndex:j];
                    dobject.dealsMessage = dealMessage;
                    [self.items addObject:dobject];
                    [dobject release];
                }
            }
            else
            {
                //[dealUrl enumerateObjectsUsingBlock:^(id obj,NSUInteger idx,BOOL *stop)
                for(int j=0;j<[dealUrl count];j++)
                {
                    PopularHypesModal *dobject=[[PopularHypesModal alloc]init];
                    dobject.dealsID = dealId;
                    dobject.dealDescription = dealdesc;
                    dobject.dealsMessage = dealMessage;
                    if([dealcaption count]>0)
                    {
                        dobject.dealcaption =[dealcaption objectAtIndex:0];
                    }
                    dobject.dealsUrl=[dealUrl objectAtIndex:j];
                    [self.items addObject:dobject];
                    [dobject release];
                }
                // ];
            }
        }
        //];

        carousel.dataSource = self;
        carousel.delegate = self;

    }onFailure:^(NSError *error) {
        NSLog(@"Error fetching: %@", error);
        popularHypes = YES;
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Server Problem" message:@"Sorry, There is some Error with server,Please try after some time" delegate:nil cancelButtonTitle:@"Cancel" otherButtonTitles:@"Ok", nil];
        [alert show];
        [alert release];
        ij++;
    }];//1st

    [dealDict retain];
}

私がxibに追加したボタン、どうすればこれを克服できますか?

4

2 に答える 2

1

同じバックグラウンド スレッドから UI 要素を更新しようとしない限り、バックグラウンド スレッドで実行しても問題は発生しません。UI 関連のアクティビティは必ずメイン スレッドに転送してください。例えば:

- (void)viewWillAppear:(BOOL)animated {
    [self performSelectorInBackground:@selector(refreshTableView)];
    [super viewWillAppear:animated];
}

- (void)refreshTableView {
    // YourCode
    [self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:YES];
}

お役に立てば幸いです:)

于 2013-08-27T04:08:45.080 に答える