私はステータス アプリケーションを持っています。すべてを投稿するには長いので、それについて説明し、コードの一部のみを投稿します。
- xib ファイルには、AboutController と PreferencesController の 2 つのオブジェクトがあります。
- アプリ デリゲートは、AboutController と PreferencesController のパネルを起動できます。
- パネルも xib ファイルに含まれています。
- ユーザーは、ステータス メニュー項目を選択して、これら 2 つのパネルを起動できます。
- HTML ページを常にダウンロードして読み取るタイマーがあります。
- ページがダウンロードされると、ラベルの stringValue が変更されます。ただし、stringValue は PreferencesController から変更されることもあります。ページはバックグラウンド スレッドからダウンロードされますが、メイン キューを通じて変更されます。
今、私はいくつかの質問があります:
- アプリケーションがスリープ状態になったとき (コンピューターがスタンバイ状態になったとき) にタイマーを無効にし、タイマーがオンになったときに別のタイマーを作成する必要がありますか?
- ラベルはメイン キューで更新されるため、ミューテックスでラベル アクセスを保護する必要がありますか?
- パネルが見つからないことがあります: アプリケーションの開始時に、メニュー項目をクリックしてパネルを起動できますが、起動しないことがあります.このバグを常に再現する方法がわかりません.アプリケーションが起動するとランダムに発生します.は通常 2/3 時間アクティブです。これを回避するには、アプリケーションを再起動する必要があります。
コードが長すぎます。これはコードの一部です。
- (void) checkPosts: (id ) sender
{
NSOperationQueue* queue=[NSOperationQueue new];
queue.maxConcurrentOperationCount=1;
[queue addOperationWithBlock:^
{
NSNumber* newPosts= [self updatePosts];
NSNumber* posts= [controller posts];
if([posts integerValue]!=[newPosts integerValue])
{
NSOperationQueue* queue=[NSOperationQueue mainQueue];
posts= newPosts;
[queue addOperationWithBlock:^
{
// This is where I may have a race condition
item.attributedTitle=[[NSAttributedString alloc]initWithString: [formatter stringFromNumber: posts] attributes: @{NSForegroundColorAttributeName : [controller color], NSFontAttributeName : [NSFont userFontOfSize: 12.5]}];
}];
// That's not so relevant:
NSUserNotification* notification=[NSUserNotification new];
notification.title= [NSString stringWithFormat: @"posts Changed to %@",posts];
notification.deliveryDate=[NSDate date];
notification.soundName= NSUserNotificationDefaultSoundName;
NSUserNotificationCenter* center=[NSUserNotificationCenter defaultUserNotificationCenter];
[center deliverNotification: notification];
center.delegate= self;
[controller setPosts: posts];
}
}];
}
少し背景情報:
- このメソッドはバックグラウンド スレッドで機能します。
- [self updatePosts] HTML ページをダウンロードし、投稿数を返します。
- [コントローラの投稿] NSUserDefaults を使用して以前の投稿数を読み取ります。
- item は、ステータス メニューのメニュー項目です。
詳細
これは私がタイマーを取得する方法です:
// In the applicationDidFinishLaunching method
timer=[NSTimer scheduledTimerWithTimeInterval: [interval integerValue ] target: self selector: @selector(checkReputation:) userInfo: nil repeats: YES];
timer はプロパティです:
@property (nonatomic, strong) NSTimer* timer;
interval は NSNumber であり、整数値が 1 以上であることを確認してください。