2013-04-16 2 views
1

질문이 있습니다.NSBlockOperation NSOperation에서 메서드 호출

NSBlockOperation *op=[NSBlockOperation blockOperationWithBlock:^{ 

     [[ClassA sharedInstance] someSingletonMethod:params1]; 
     [ClassB classBMethod:params2]; 
     [self currentClassMethod:params3]; 

     [[NSOperationQueue mainQueue] addOperationWithBlock:^{ 
      [[NSNotificationCenter defaultCenter] postNotificationName:@"kSNotificationName" object:nil]; 
     }]; 
    }]; 

[self.myOperationQueue addOperation:op]; 

는 안전한가요 블록에 단일 메소드를 호출하기 : 나는 다음과 같은 코드가? 블록의 클래스 메소드를 호출하는 것이 안전합니까? "self"메소드를 호출하는 것이 안전합니까?

다음과 같은 상황이 있습니다. 서버에 일괄 요청을 보내고 있습니다.

AFHTTPClient *client=[[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:baseURL]]; 
[client registerHTTPOperationClass:[AFJSONRequestOperation class]]; 
[client enqueueBatchOfHTTPRequestOperations:reqOps progressBlock:^(NSUInteger numberOfFinishedOperations, NSUInteger totalNumberOfOperations) { 
    NSLog(@"finished: %i of %i requests", numberOfFinishedOperations, totalNumberOfOperations); 
    [[PTDictionaryUpdate sharedInstance] debugPrint:[NSString stringWithFormat:@"finished: %i of %i requests", numberOfFinishedOperations, totalNumberOfOperations]]; 
} completionBlock:^(NSArray *operations) { 
    NSLog(@"operations finished"); 

여기 응답을 처리하는 방법은 무엇입니까? 완료된 요청을 처리하기위한 작업을 만들고 있습니다.

for (int i=0; i<[operations count]; i++) 
    { 
     AFJSONRequestOperation *operation=[operations objectAtIndex:i]; 
     if ((operation.error==nil) && (operation.response.statusCode==200)) 
     { 
      id JSON=operation.responseJSON; 
      int handleMethodIndex=-1; 
      for (int j=0; j<[urls count]; j++) 
      { 
       if ([operation.request.URL isEqual:[urls objectAtIndex:j]]) 
       { 
        handleMethodIndex=j; 
       }; 
      }; 

      switch (handleMethodIndex) { 
       case 0: 
       { 
        //[self countryUpdate:JSON]; 

        NSInvocationOperation *invOp=[[NSInvocationOperation alloc] initWithTarget:self selector:@selector(countryUpdate:) object:JSON]; 
        [invOp setQueuePriority:NSOperationQueuePriorityLow]; 
        [handleJSONOperations addObject:invOp]; 
        break; 
       } 
       case 1: 
       { 
        //[self regionsUpdate:JSON]; 

        NSInvocationOperation *invOp=[[NSInvocationOperation alloc] initWithTarget:self selector:@selector(regionsUpdate:) object:JSON]; 
        [invOp setQueuePriority:NSOperationQueuePriorityLow]; 
        [handleJSONOperations addObject:invOp]; 
        break; 
       } 
       //....... 
      //....... 
     } 

나는 서버에서 가져온 처리 할 작업 (프로세스 및 업데이트 데이터베이스) JSON과 배열을 만든 후 :

NSBlockOperation *op=[NSBlockOperation blockOperationWithBlock:^{ 

     //first we need to tether countries, regions and cities 
     [[PTDataTetherer sharedInstance] tetherCountriesRegionsCitiesInContext:self.updateContext]; 

     //generating fake agencies 
     //[PTFakeAgencyGenerator generateAgenciesInContext:context]; 

     //generating fake clients 
     //[PTFakeClientGenerator generateClientsInContext:context]; 

     //generating fake reports 
     [[PTFakeReportGenerator sharedInstance] generateReportsInContext:self.updateContext]; 

     //generating fake presentations 
     [[PTFakePresentationGenerator sharedInstance] generatePresentationsInContext:self.updateContext]; 


     //tethering 
     [[PTDataTetherer sharedInstance] tetherAgenciesWithOthersInContext:self.updateContext]; 
     [[PTDataTetherer sharedInstance] tetherClientsWithOthersInContext:self.updateContext]; 
     [[PTDataTetherer sharedInstance] tetherEventsWithOthersInContext:self.updateContext]; 
     [[PTDataTetherer sharedInstance] tetherPresentationFoldersWithImagesInContext:self.updateContext]; 

     [self saveContext]; 

     [[NSOperationQueue mainQueue] addOperationWithBlock:^{ 
      [[NSNotificationCenter defaultCenter] postNotificationName:@"kSynchronizationFinishedNotification" object:nil]; 
     }]; 
    }]; 
    [op setQueuePriority:NSOperationQueuePriorityLow]; 
    if ([handleJSONOperations count]==0) 
    { 
     [[NSOperationQueue mainQueue] addOperationWithBlock:^{ 
      [[NSNotificationCenter defaultCenter] postNotificationName:@"kSynchronizationFinishedNotification" object:nil]; 
     }]; 
    } 
    else 
    { 
     [self.serverUpdateQueue addOperation:updateContextCreateOperation]; 
     [handleJSONOperations addObject:op]; 
     [self.serverUpdateQueue addOperations:handleJSONOperations waitUntilFinished:NO]; 
    }; 

은 기본적으로 내가 같은 방법으로 큐를 구성하려면 : 를 1. [문맥 작성 조작] 2. [서버로부터 수신 된 json을 구문 분석하고 새로운/수정 객체를 컨텍스트에/컨텍스트에 저장하는 다중 컨텍스트 수정 작업] 3. 컨텍스트를 수정하고 마지막에는 , 저장 메소드를 호출하여 변경 사항을 저장 영역에 전파 한 다음 다른 컨텍스트에 NSManagedObjectContextDidSaveNotifications 사용]

+0

왜 안전하지 않아야합니까? 문제가 발생 했습니까 (예외 또는 충돌)? –

답변

2

블록에서 싱글 톤 메서드를 호출하는 것이 안전합니까?

싱글 보드의 질문에 대한 질문입니다.

클래스 메서드를 블록으로 호출하는 것이 안전합니까?

귀하가 수행하는 방법에 따라 다릅니다. 내 경험과 코드에서, 그렇습니다.

"자체"메소드를 호출하는 것을 저장합니까?

self의 참조를 블록에 전달하면 메모리 누수가 발생할 수 있습니다.

+0

기본적으로 나는 그런 것을하고 싶다 : – user1897723

+0

너는 무엇을하고 싶어? – Peres

+0

내 대답을 편집하기로 결정했습니다. =) – user1897723