2014-04-07 39 views
0

嗨善良的人我想,以防止iOS版 - 应用程序冻结当我获取请求死锁

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
dispatch_async(queue, ^{ CODE }); 

冻结,但我不知道如何使用功能..我不知道在哪里把managedObjectContext以及如何使用这个dispatch_async我的代码是:

- (void)updateFacebookFriendsHighScore{ 
    NSFetchRequest *requestche =[NSFetchRequest fetchRequestWithEntityName:@"Time"]; 
    [requestche setReturnsObjectsAsFaults:NO]; 
    NSPredicate *predicate=[NSPredicate predicateWithFormat:@"timeid==1"]; 
    requestche.predicate=predicate; 
    NSArray *getIDTime = [self.managedObjectContext executeFetchRequest:requestche error:nil]; 
    NSString *getTheTime = [[getIDTime valueForKey:@"time"] componentsJoinedByString:@""]; 
    NSNumber *timeInInt = [NSNumber numberWithInteger: [getTheTime intValue]]; 
    int timeFromDB = [timeInInt intValue]; 
    timeFromDB = timeFromDB + 509; 
    int timeNow = [[NSDate date] timeIntervalSince1970]; 
    if(timeNow > timeFromDB){ 
     NSFetchRequest *updateHighScoreRequest = [NSFetchRequest fetchRequestWithEntityName:@"Friends"]; 
     [updateHighScoreRequest setReturnsObjectsAsFaults:NO]; 
     NSArray *friendsToUpdate = [self.managedObjectContext executeFetchRequest:updateHighScoreRequest error:nil]; 
     for(NSArray *friendId in friendsToUpdate){ 
      NSString *getFriendId = [friendId valueForKey:@"fbid"] ; 
      NSString *siteURL = [NSString stringWithFormat:@"http://www.example.com/example.php?fbid=%@", getFriendId]; 
      NSURLRequest *urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:siteURL]]; 
      [NSURLConnection sendAsynchronousRequest:urlRequest queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { 
       NSString *resultsFromDB = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
       NSNumber *theScoreForUpdate = [NSNumber numberWithInt:[resultsFromDB intValue]]; 
       NSFetchRequest *updateTheHighScoreRequest = [NSFetchRequest fetchRequestWithEntityName:@"Friends"]; 
       NSPredicate *updateTheHighScorePredicate = [NSPredicate predicateWithFormat:@"fbid==%@",getFriendId]; 
       updateTheHighScoreRequest.predicate=updateTheHighScorePredicate; 
       Friends *setScore = [[self.managedObjectContext executeFetchRequest:updateTheHighScoreRequest error:nil] lastObject]; 
       NSLog(@"%@", setScore); 
       [setScore setValue:theScoreForUpdate forKey:@"score"]; 
       [self.managedObjectContext save:nil]; 
       data = nil; 
       resultsFromDB = nil; 
       theScoreForUpdate = nil; 
       setScore = nil; 
     }]; 
     updateHighScoreRequest = nil; 
     } 
    } 
    requestche = nil; 
} 

此代码从数据库中获取的时间和从CD结果更新509秒后的高分,当我运行这个要求我的应用程序冻结(死锁) 。 我来自保加利亚,我正在努力学习目标C.在这里,我们没有学校,因为我们的国家在所有情况下都非常糟糕,保加利亚在欧洲联盟中排在最后...... 一些认真和善于帮助的人我与我的代码或解释如何在Objective C中工作的一切,或只帮助我呢?

+0

您是否在应用程序中使用线程?如果你了解他们是什么? –

+0

你有Skype帮助我,我会在这里发布答案,我会向不知道像我这样的人解释:) 我的Skype是:smoka_bogdan –

+0

抱歉不是现在,我在办公室。可能在某个时间晚些时候。 –

回答

0

试试看看这个代码。为了尽可能简化应用程序,请勿将Core数据代码从主线程中取出,即与self.managedObjectContext相关的任何事情,例如保存或执行提取请求。这是因为核心数据不是线程安全的,您将不得不设置一个策略来处理它。我假设你的申请很简单,你不需要这样的策略。因此,请尽量保持简单,并始终在主线程上执行核心数据操作(保存,执行)。 dispatch_async(dispatch_get_main_queue(), ^{ code });将在主线程上执行它。

-(void) updateFacebookFriendsHighScore 
{ 
    dispatch_async(dispatch_get_main_queue(), ^{ 

     NSFetchRequest *requestche =[NSFetchRequest fetchRequestWithEntityName:@"Time"]; 
     [requestche setReturnsObjectsAsFaults:NO]; 
     NSPredicate *predicate=[NSPredicate predicateWithFormat:@"timeid==1"]; 
     requestche.predicate=predicate; 
     NSArray *getIDTime = [self.managedObjectContext executeFetchRequest:requestche error:nil]; 
     NSString *getTheTime = [[getIDTime valueForKey:@"time"] componentsJoinedByString:@""]; 
     NSNumber *timeInInt = [NSNumber numberWithInteger: [getTheTime intValue]]; 
     int timeFromDB = [timeInInt intValue]; 
     timeFromDB = timeFromDB + 509; 
     int timeNow = [[NSDate date] timeIntervalSince1970]; 
     if(timeNow > timeFromDB){ 
      NSFetchRequest *updateHighScoreRequest = [NSFetchRequest fetchRequestWithEntityName:@"Friends"]; 
      [updateHighScoreRequest setReturnsObjectsAsFaults:NO]; 
      NSArray *friendsToUpdate = [self.managedObjectContext executeFetchRequest:updateHighScoreRequest error:nil]; 
      for(NSArray *friendId in friendsToUpdate){ 
       NSString *getFriendId = [friendId valueForKey:@"fbid"] ; 
       NSString *siteURL = [NSString stringWithFormat:@"http://www.example.com/example.php?fbid=%@", getFriendId]; 
       NSURLRequest *urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:siteURL]]; 
       [NSURLConnection sendAsynchronousRequest:urlRequest queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { 
        NSString *resultsFromDB = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
        NSNumber *theScoreForUpdate = [NSNumber numberWithInt:[resultsFromDB intValue]]; 
        NSFetchRequest *updateTheHighScoreRequest = [NSFetchRequest fetchRequestWithEntityName:@"Friends"]; 
        NSPredicate *updateTheHighScorePredicate = [NSPredicate predicateWithFormat:@"fbid==%@",getFriendId]; 
        updateTheHighScoreRequest.predicate=updateTheHighScorePredicate; 
        Friends *setScore = [[self.managedObjectContext executeFetchRequest:updateTheHighScoreRequest error:nil] lastObject]; 
        NSLog(@"%@", setScore); 
        [setScore setValue:theScoreForUpdate forKey:@"score"]; 
        [self.managedObjectContext save:nil]; 
        data = nil; 
        resultsFromDB = nil; 
        theScoreForUpdate = nil; 
        setScore = nil; 
       }]; 
       updateHighScoreRequest = nil; 
      } 
     } 
     requestche = nil; 

    }); 
} 
+0

此代码也冻结... –

+0

嗯。我认为比你有一些在核心数据上执行代码的线程。有没有什么办法可以分享你的代码,以便我可以查看它,如果可能的话? –

+0

http://bbogdanov.us/hilo/index.txt here mate :) 请给我一个电子邮件或一些联系方式。 我想亲自联系你:) http://facebook.com/bbogdanov –