UIView サブクラスに ( と の両方を試した) と プロパティがありUITextView logView
ます。次のように、プロパティに KVO を追加しました。atomic
nonatomic
NSOperationQueue uploadQueue
NSOperationQueue
operationsCount
[[self uploadQueue] addObserver:self
forKeyPath:@"operationCount"
options:(NSKeyValueObservingOptionNew |
NSKeyValueObservingOptionOld)
context:NULL];
オブザーバー関数は次のようになります。
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context
{
if ([object isKindOfClass: [NSOperationQueue class]]) {
NSLog(@"Keypath is: %@ change dictionary is: %@", keyPath, change);
NSInteger testnew = [[change objectForKey: @"new"] integerValue];
NSInteger testold = [[change objectForKey: @"old"] integerValue];
if (testnew > testold) {
[[self logView] setText: [NSString stringWithFormat: @"Uploading %d files", testnew]];
objc_setAssociatedObject([self logView], @"max_value_of_uploads", [change objectForKey: @"new"], OBJC_ASSOCIATION_COPY);
} else {
NSInteger value = [objc_getAssociatedObject([self logView], @"max_value_of_uploads") integerValue];
[[self logView] setText: [NSString stringWithFormat: @"Uploaded %d of %d files", testnew, value]];
}
}
}
uploadQueue
塗りつぶしは次のように機能します。
...
NSDictionary *iter;
NSEnumerator *enumerator = [objects objectEnumerator];
while (iter = [enumerator nextObject]) {
Uploader *op = [[Uploader alloc] initWithFileName: [iter objectForKey: @"fileName"]
FileID: [[iter objectForKey: @"fileID"] integerValue]
AndSessionID: [self sess]];
//Uploader *op = [[Uploader alloc] init];
[[self uploadQueue] addOperation: op];
...
ブロックがなければif-else
、すべて正常に機能します。キュー内の操作の数に関する NSLog メッセージを受け取りました。数値は問題ありません。しかし、そのif-else
ブロックでは、次のようなクラッシュが発生します。
bool _WebTryThreadLock(bool), 0x10617fb0: Tried to obtain the web lock from a thread other than the main thread or the web thread. This may be a result of calling to UIKit from a secondary thread. Crashing now...
1 WebThreadLock
2 -[UITextView setText:]
3 -[SincViewController observeValueForKeyPath:ofObject:change:context:]
4 NSKeyValueNotifyObserver
5 NSKeyValueDidChange
6 -[NSObject(NSKeyValueObservingPrivate) _changeValueForKey:key:key:usingBlock:]
7 -[NSObject(NSKeyValueObservingPrivate) _changeValueForKey:usingBlock:]
8 ____NSOQDelayedFinishOperations_block_invoke_0
9 -[NSObject(NSKeyValueObservingPrivate) _changeValueForKey:key:key:usingBlock:]
10 -[NSObject(NSKeyValueObservingPrivate) _changeValueForKey:usingBlock:]
11 __NSOQDelayedFinishOperations
12 _dispatch_after_timer_callback
13 _dispatch_source_invoke
14 _dispatch_queue_invoke
15 _dispatch_worker_thread2
16 _pthread_wqthread
17 start_wqthread
ブロックでクラッシュしelse
ます。さらに、logView に変更が見られません。今後ともよろしくお願いいたします。
更新: performSelectorOnMainThread
テキストを設定すると、私は救われました。