질문이 있습니다.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 사용]
왜 안전하지 않아야합니까? 문제가 발생 했습니까 (예외 또는 충돌)? –