2017-10-18 12 views
0

Xcode 9では、コンパイラがバックグラウンドスレッドからUIKitを呼び出していることが分かると、アナライザーの警告が表示されます。メソッドをメインスレッドとしてマークしますか?

自分の方法でこれを取得する方法はありますか?例えば

他の場所
@interface MyObject 

- (void)doThingOnMainThread NS_MAIN_THREAD_ONLY; 
// where NS_MAIN_THREAD_ONLY is a thing I just made up, as far as I know 

@end 

- (void)otherMethod { 
    MyObject *myObject = [MyObject sharedObject]; 
    dispatch_queue_t queue = 
     dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
    dispatch_async(queue, ^{ 
     // I'd like a warning here, if possible! 
     [myObject doThingOnMainThread]; 
    }); 
} 
+0

あなたは、多くの場合、 'dispatchPrecondition(条件を使用したい:.onQueue (.main)) 'となります。 Objective-Cでは、['[NSThread isMainThread]'](https://developer.apple.com/documentation/foundation/nsthread/1408455-ismainthread)に基づいて 'NSAssert'または' NSLog'を実行している可能性があります。 – Rob

答えて

1

私が得ることができる最も近いました:

- (void)testFunc { 
    ENSURE_MAIN_THREAD 

    printf("HERE"); 
} 

- (void)testRun { 
    dispatch_async(dispatch_get_global_queue(0, 0), ^{ 
     [self testFunc]; 
    }); 
} 

#ifdef DEBUG 
    #if TARGET_OS_SIMULATOR 
     #define ENSURE_MAIN_THREAD if (![NSThread isMainThread]) { \ 
      printf("ERROR: UI USAGE ON BACKGROUND THREAD\n"); \ 
      __asm__ volatile("int3"); \ 
     } 
    #else 
     #define ENSURE_MAIN_THREAD if (![NSThread isMainThread]) { \ 
      printf("ERROR: UI USAGE ON BACKGROUND THREAD\n"); \ 
      __builtin_debugtrap(); \ 
     } 
    #endif 
#endif 

は、その後、私は次のようにそれを使用

バックグラウンドスレッドで実行された場合、ブレークポイントまたはトラップが作成されるので、スタックをXCodeで確認して呼び出しの元に戻すことができます。

AppleのMain-Thread-Checkerと同じようにランタイムです(静的アナライザーに警告を表示することができませんでした)。コードを実行したときにのみMain-Thread-Checkerが一時停止します主なスレッドでエラーを表示する)。

唯一の問題は、私は道に「MARK」メインスレッドのみとしての機能を見つけることができませんでした..しかし、これが近いこと..です

スウィフトで
+0

ええ、私は 'NSAssert(NSThread.isMainThread、...);で多くのメソッドを始めるところまできています。しかし、それらの多数は、私が投稿したものとほぼ同じくらい簡単で、仲間が見つけやすいはずです。 :) –

関連する問題