완성 : 완료 콜백은 이 아니며 네트워크 상태가 변경 될 때이 호출되지 않습니다 (즉, Unfreeze 이후)
그러나 당신은 줄에 -checkAndRestoreFrozenOperations을 행동 (1)를 타고 MKNetworkOperation.m에 중단 점을 배치하면 :
[self enqueueOperation:pendingOperation]
하면 네트워크 연결이 복원 될 때 호출되는 것을 발견하고, 그 것 pendingOperation은입니다. 보류중인 POST입니다. 그러나 새로운 MKNetworkOperation이 인스턴스화되었으므로 (완료 블록이 더 이상 존재하지 않을 수도 있음) onCompletion
블록이 호출되지 않습니다. 가능한 한 가지 해결 방법은 콜백 대신 알림을 사용하는 것입니다.
완전한 수정 : (2) 출시를 통해 작동합니다보다보다 강력한 접근 방식은 NSNotifications하여 ^{}
블록 콜백을 교체하는 것입니다. AppDelegate 에서처럼 청취자를 일찍 등록하십시오.다음은 MKNetworkKit 알림을 알기 쉽게하기 위해 필요한 최소 변경 사항입니다.
3a. MKNetworkOperation.h
에서 삽입 알림 상수 #define MKNetworkOperationCompletionNotification @"MKNetworkOperationCompletionNotification"
#define MKNetworkOperationErrorNotification @"MKNetworkOperationErrorNotification"
3B. 방송 MKNetworkOperation.m -operationSucceeded에 성공 통지 (I 그래서 통지가 메인 스레드에서 말을 듣고 UI를 변경할 수 있습니다 말했다 postNotificationOnMainThread를 사용주의 사항, NSOperation and NSNotificationCenter on the main thread 참조)
-(void) operationSucceeded {
NSDictionary * aUserInfo = [NSDictionary dictionaryWithObjectsAndKeys:
self, NSStringFromClass([MKNetworkOperation class]),
nil];
NSNotification * notification = [NSNotification notificationWithName:MKNetworkOperationCompletionNotification
object:nil
userInfo:aUserInfo];
[[NSNotificationCenter defaultCenter] postNotificationOnMainThread:notification];
...
3C. 방송 MKNetworkOperation.m -operationFailedWithError
-(void) operationFailedWithError:(NSError*) error {
self.error = error;
NSDictionary * aUserInfo = [NSDictionary dictionaryWithObjectsAndKeys:
self, NSStringFromClass([MKNetworkOperation class]),
error, NSStringFromClass([NSError class]),
nil];
NSNotification * notification = [NSNotification notificationWithName:MKNetworkOperationErrorNotification
object:nil
userInfo:aUserInfo];
[[NSNotificationCenter defaultCenter] postNotificationOnMainThread:notification];
...
차원에서 실패 알림. 청취자가 (등록 해제하는 것을 잊지 마세요)로의 AppDelegate에처럼 오히려 영속 객체를 등록
// Listen to POST changes
NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter];
[defaultCenter addObserver:self
selector:@selector(mkNetworkOperationCompletionNotification:)
name:MKNetworkOperationCompletionNotification
object:nil];
[defaultCenter addObserver:self
selector:@selector(mkNetworkOperationErrorNotification:)
name:MKNetworkOperationErrorNotification
object:nil];
3E를. 청취자의 모습 수 있는지의 샘플 코드 :
- (void)mkNetworkOperationCompletionNotification:(NSNotification*)notification {
MKNetworkOperation *operation = [[notification userInfo]
objectForKey:NSStringFromClass([MKNetworkOperation class])];
NSLog(@"operationSucceeded: %@", [operation responseString]);
}
- (void)mkNetworkOperationErrorNotification:(NSNotification*)notification {
NSError * error = [[notification userInfo] objectForKey:NSStringFromClass([NSError class])];
NSLog(@"operationFailedWithError: %@", [error localizedDescription]);
}
당신이 호스트에서 설정 했 엔진? 고정 된 작업이 처리되는 방식을 보면 엔진에 정의 된 호스트가 없으면 작동하지 않습니다. –
@KenWoo 예. 내 엔진 하위 클래스의 init 메소드는'[super initWithHostName :]'을 호출합니다. –
msoler
@msoler 작동 시키셨습니까? 나는 비슷한 문제가있다 – alandalusi