2014-11-26 2 views
0

내가 원하는 일은 백그라운드 스레드에서 비동기 핵심 데이터 작업을 생성하여 주 스레드를 씹지 않도록하는 것이지만 작업이 완료되면 주 스레드 작업을 수행하려고합니다. 다 ... dispatch_async dispatch_get_main_queue() dispatch_get_main_queue() inside NSManagedObjectContext performBlock

여기 여기

  [[MYCoreDataManager sharedInstance]doTaskwithCompletion:^(BOOL complete) { 

       if (complete == YES) { 

        dispatch_async(dispatch_get_main_queue(), ^{ 

         // back to the main thread        
        }); 
       } 

      }]; 

뭔가이 잘못 알려줍니다 내 블록 방법의 내 작업

-(void)doTaskwithCompletion:(coreDataCompletion)complete 
    { 
    [self.backgroundManagedObjectContext performBlock:^{ 

     // do my BG core data task 

     [self saveContext:self.backgroundManagedObjectContext]; 
     complete(YES); 

    }]; 
    } 

...하지만 나는 myse를 넣어 또 다른 방법을 찾을 수 없습니다 블록이 완료되면 주 스레드로 돌아가서 ... 알림이 너무 clunky 것 같습니다.

간단히 말해서 내 질문은 moc performBlock:^ 안에 dispatch_async(dispatch_get_main_queue()으로 전화 할 수 있습니까?

는 기본적으로

-(void)doTaskwithCompletion:(coreDataCompletion)complete 
    { 
    [self.backgroundManagedObjectContext performBlock:^{ 

     // do my BG core data task 

     [self saveContext:self.backgroundManagedObjectContext]; 
     dispatch_async(dispatch_get_main_queue(), ^{ 

      // back to the main thread  

     }); 

    }]; 
    } 
+1

문제가 무엇 [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];? 왜 네가 할 수 없다고 생각하니? –

답변

2

"나는 한마디로 가정 내 문제는 내가 MOC performBlock 내부 dispatch_async을 (dispatch_get_main_queue()를 호출 할 수 있습니다 :? ^!"

네 사실, 당신이 대답을하다입니다 main thread에서 performBlock을 호출 할 때 그 역행을하는 것입니다. 이것은 iOS의 일반적인 기능입니다. 아마도 이것을 수행하는 더 깨끗한 방법은 완료를 전달하는 것입니다 ...

지금 받으시는 분 :

dispatch_async(dispatch_get_main_queue(), ^{ 

     // back to the main thread 
     completion() 



    }); 

당신은 또한 다음과 같이 작성할 수있다 :

-(void)doTaskwithCompletion:(coreDataCompletion)complete 
{ 
[self.backgroundManagedObjectContext performBlock:^{ 

    // do my BG core data task 

    [self saveContext:self.backgroundManagedObjectContext]; 
    complete() 

}]; 
} 

가 완료가 메인 스레드에 대한 호출을이 곳. 이미 변수 self.backgroundManagedObjectContext 당신은 아마 마음라는 이름으로

dispatch_async(globalQueue, ^{ 
    // do something 
    dispatch_async(mainQueue, ^{ 
     // update UI 
    }); 
}); 

:

+0

괜찮습니까? 큰! 내 코드에서 어딘가에 이상한 교수형이있어 ... 조사 할게. 감사! – Magoo

3

나는 당신이 뭔가 비동기를 호출하고 내부 UI를 업데이트 즉, mainQueue로 돌아 갈 수있는 매우 일반적인 패턴 것을 알고 생각 Multi-Context CoreData입니다. 귀하의 우려를 이해합니다. Context에서 CoreData에 대해이 블록을 사용하여 무언가를 변경하려고하지 않는다면 아마 괜찮을 것입니다.

그냥 당신이 당신의 상황에 대한 올바른 초기화를 사용해야합니다, 즉

+0

그래, 그게 다 맞아. performBlock이 GCD와 관련해서 다루어 졌는지 확신 할 수 없었어 .. NSPrivateQueueConcurrencyType이 설정 되었어. 근본적으로 네 예제와 같으면 난 행복해! – Magoo

관련 문제