performselectorinBackground不起作用

时间:2013-08-27 02:23:37

标签: iphone ios multithreading core-data stackmob

在视图中,我正在显示我从coredata获取的图像,我使用轮播类显示的图像。在同一视图中我有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中添加的按钮,我该如何克服这个?

2 个答案:

答案 0 :(得分: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];
}

希望它有用:)

答案 1 :(得分:0)

请尝试使用此NSThread方法 [NSThread detachNewThreadSelector:@selector(RunMethodEvenWhenMinimized)toTarget:self withObject:dict];