2015-01-08 2 views
1

백그라운드 비동기 호출을 사용하는 일부 객체에 대해 구문 분석을 쿼리하고 있습니다. 그러나 쿼리가 진행되는 동안 앱이 멈 춥니 다. 나는 그것과 상호 작용할 수 없다. 쿼리가 완료되고 개체가로드되면 앱이 멈 춥니 다. 비동기 작업이기 때문에 쿼리 중에 앱이 응답해야한다는 것을 알고 있습니다.비동기 쿼리 구문 분석 중에 iOS 앱이 멈 춥니 다.

예를 들어 앱에서 쿼리가 시작될 때 -> 쿼리 중에 탐색 바를 뒤로 밀면 아무 일도 일어나지 않습니다. - 쿼리가 끝나고 내 개체가 나타남 -> 응답으로 루트 컨트롤러에 앱이 팝업됩니다. 이전 터치로

쿼리 후에 앱이 고정되지 않았습니다. 그것은 정상적으로 응답합니다. 문제가 내 배치 위치인지, 파싱 할 때 전화가 느려지는지 확실하지 않습니다. 어떤 도움을 주시면 감사하겠습니다 !!

관련 코드 :

-(void)viewWillAppear:(BOOL)animated{ 
    [super viewWillAppear:animated]; 

    //Loads the users to be rated 
    [self loadNewUsersAndAd]; 
} 

-(void)loadNewUsersAndAd{ 
    self.usersQuery = [PFQuery queryWithClassName:@"UserObjects"]; 
    [self.usersQuery findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { 
     self.queryingForUsers = YES; 
     if (error) { 
      UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Sorry!" message:@"It looks like we couldn't update your current games! Make sure you're connected to the internet." delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil]; 
      [alertView show]; 
      self.queryingForUsers = NO; 
     } 
     else 
     { 
      //The query was successful 
      self.usersArray = objects; 
      [self loadNewImages]; 
      self.queryingForUsers = NO; 

    } 

}]; 



} 
+0

'loadNewImages'는 무엇을합니까? UI 요소를 업데이트합니까? 그럴 경우 메인 큐로 보내야합니다. – Paulw11

+0

쿼리는 파스와 연관된 세 개의 그림이있는 구문 분석에서 userObject를로드합니다. userObject가로드되면 loadNewImages를 호출하여 연관된 그림으로 UI를 업데이트합니다. 이 UI 업데이트를 쿼리에 포함 시키는데 문제가 있습니까? 만약 그렇다면 어떻게 다른 일을 할 수 있습니까? 지금까지 나를 cluing 주셔서 감사합니다! –

답변

2

당신은 백그라운드 스레드에서 UI 요소를 업데이트해야합니다. 당신의 loadNewImages 메인 큐에 파견되어 있는지 확인 -

self.usersArray = objects; 
dispatch_async(dispatch_get_main_queue(), ^{ 
    [self loadNewImages]; 
    self.queryingForUsers = NO; 
}); 
+0

응답 해 주셔서 감사합니다. 그러나이 문제를 해결하는 것으로 나타나지 않습니다. –

+0

그런 다음 여기에 나와 있지 않은 일부 코드에 문제가 있습니다. 디버거에서 싱글 스테핑을 시도 할 수 있습니다. – Paulw11

+0

감사합니다. –

0

당신이 self.usersQuery에 대한 속성 집합이 이유는 무엇입니까? 다른 곳에서 사용하고 있습니까? 나는 당신의 나머지 코드를 볼 수 없기 때문에 왜 당신이 쿼리를 위해 프로퍼티를 설정했는지 모르지만, 당신이이 쿼리를 호출하여 애플리케이션에 혼란을 야기 할 때 역 추적 할 수있다. 일반적으로이 구문 분석 쿼리에 대한 속성을 설정 할 필요가 없지만 다음과 같은 시도 할 수 있습니다 :

-(void)loadNewUsersAndAd{ 
PFQuery *usersQuery = [PFQuery queryWithClassName:@"UserObjects"]; 
[usersQuery findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { 
     //Other Code 
    } 
    else 
    { 
     //Other Code 
} 
}]; 

또한, Paulw11이 올바른지, 당신은 백그라운드 스레드에서 UI 요소를 업데이트하지 말아야, 비록 그가 보여준 코드를 추가해도 지금은 효과가 없다고하더라도 그것이 정확하지 않다는 것을 의미하지는 않습니다. 프로젝트가 정확하고 문제점이 다른 곳에 있기 때문에 프로젝트에 그대로 두십시오.

여기에 많은 변수가 있습니다. 이미지를 어떻게 표시하고, 한꺼번에 표시하고, 셀 등을 재사용하고 있습니까? 이미지로드에 대한 구현을보십시오. 해당 줄을 주석으로 처리하고 거기에서 문제를 해결하십시오. 주석 처리 된 이미지 코드와 아직 시차가 없으면 찾아야 할 추가 문제가 있습니다.

+0

입력 해 주셔서 감사합니다. Paulw의 대답에 대해 확인하는 것이 좋습니다. 감사합니다. 내 코드를 살펴 보겠습니다. 또한 우연히 다른 스레드에서 [self.usersQuery cancel]을 호출하기 때문에 쿼리를 속성으로 만들었습니다. 어쩌면 그게 문제 야. –