2

iPhone アプリケーションで、ユーザーが完了するまで待機する必要のある操作を行っている場合があることがわかりました。多くの場合、これはネットワーク関連のアクティビティですが、そうでない場合もあります。私の場合、ネットワーク接続からの応答を解析していて、コンテンツが既にダウンロードされていても、ネットワーク アクティビティ インジケーターが回転し続けることを望んでいました。

以下は私がやっていることです:

applicationDelegate.m :

- (void)setNetworkActivityIndicatorVisible:(BOOL)setVisible
{
    static NSInteger NumberOfCallsToSetVisible = 0;
    if (setVisible) 
        NumberOfCallsToSetVisible++;
    else 
        NumberOfCallsToSetVisible--;

    // Display the indicator as long as our static counter is > 0.
    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:(NumberOfCallsToSetVisible > 0)];
}

otherView.m:

dispatch_queue_t dataLoadingQueue = dispatch_queue_create("synchronise", NULL);
    dispatch_async(dataLoadingQueue,
                   ^{
                       [appDelegate setNetworkActivityIndicatorVisible:YES];
                       [[DataLoader instance]LoadDataForGrewal];
                       [[FieldConsultantViewModelManager instance] resetCache];  
                       [[DailyFieldConsultantViewModelManager instance] clearCache];
                       [appDelegate loadMainViews];
                       [[DataLoader instance]LoadDataForOtherEntities]; 
                       [appDelegate setNetworkActivityIndicatorVisible:NO];
                   });    
 dispatch_release(dataLoadingQueue);

上記のように、データをデータベースに更新している間、ネットワーク インジケーターを保持しようとしていますが、うまくいきません。手がかりや提案はありますか?

ありがとう 編集:

dispatch_queue_t dataLoadingQueue = dispatch_queue_create("synchronise", NULL);
    dispatch_async(dataLoadingQueue,
                   ^{
                       dispatch_async(dispatch_get_main_queue(), ^{ [self setNetworkActivityIndicatorVisible:YES]; });
                       [[DataLoader instance]LoadDataForGrewal];
                       [[FieldConsultantViewModelManager instance] resetCache];  
                       [[DailyFieldConsultantViewModelManager instance] clearCache];
                       [appDelegate loadMainViews];
                       [[DataLoader instance]LoadDataForOtherEntities]; 
                       dispatch_async(dispatch_get_main_queue(), ^{ [self setNetworkActivityIndicatorVisible:NO]; });
                   });    
 dispatch_release(dataLoadingQueue);

iOS初心者なのでうまくいきません。

4

2 に答える 2

2

setNetworkActivityIndicatorVisible:UIApplication は UIKit にあり、UIKit はスレッドセーフではないため、呼び出しをメイン キューにディスパッチしてみてください。

于 2012-07-19T15:09:54.797 に答える
1

完全なソリューションを探している人にとって、これは私が使用するものです(Swiftで)。ネットワーク インジケータを停止するときに、短時間遅延します。これにより、シリアル ネットワーク リクエストが多い場合にインジケーターがちらつくのを防ぐことができます。

private var networkActivityCount = 0

func updateNetworkActivityCount(increaseNumber increase:Bool)
{
    let appendingCount = increase ? 1 : -1
    networkActivityCount += appendingCount
    let delayInSeconds = increase ? 0.0 : 0.7
    perform({ () -> () in
        let application = UIApplication.sharedApplication()
        let shouldBeVisible = self.networkActivityCount > 0
        if application.networkActivityIndicatorVisible != shouldBeVisible {
            application.networkActivityIndicatorVisible = shouldBeVisible
        }
    }, afterDelay: delayInSeconds)
}

は次perform:afterDelayのように定義されています

public func perform(block: ()->(), afterDelay:Double) {
    let dispatchTime: dispatch_time_t = dispatch_time(DISPATCH_TIME_NOW, Int64(afterDelay * Double(NSEC_PER_SEC)))
    dispatch_after(dispatchTime, dispatch_get_main_queue(), {
         block()
    })
}

updateNetworkActivityCount(increaseNumber: true)リクエストの前に呼び出すだけfalseで、リクエストのコールバックでも同じです。すなわち:

updateNetworkActivityCount(increaseNumber: true)
let task = urlSession.dataTaskWithRequest(request) { data, response, error in
    self.updateNetworkActivityCount(increaseNumber: false)
    ...
于 2016-03-08T16:05:15.420 に答える