2011-06-12 73 views
0

我正在每60秒在後臺執行一些任務。後臺任務是服務器從網站請求下載文件。當請求完成時,主線程/ UI似乎被鎖定,我將數據保存到sqlite。NSThread detachNewThreadSelector鎖定主線程

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
     [NSThread detachNewThreadSelector:@selector(startTheBackgroundSync) toTarget:self withObject:nil]; 
     [pool release]; 

- (void)startTheBackgroundSync { 

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    // [self performSelectorInBackground:@selector(moveSynctoBack) withObject:nil]; 
    // [self performSelectorOnMainThread:@selector(makeMyProgressBarMoving) withObject:nil waitUntilDone:NO]; 

    serverSync = [[[ServerSync alloc]init]autorelease]; 
    while (1==1) { 
     serverSync.delegate = self; 
     [serverSync syncNow:nil]; 
     [NSThread sleepForTimeInterval:120]; 
    } 
    [pool release]; 
    [serverSync release]; 

} 

雖然循環不鎖定了主線程,但是當ASIHTtpRequest的數據完成了它鎖定了UI進行了第二次。

回答

4

ASIHTTPRequest的完成選擇器將始終在主線程上執行。因此你不應該在那裏做長時間運行的任務。

,而不啓動一個新的線程,你可以安排一個重複的NSTimer:

NSTimer* timer = [NSTimer scheduledTimerWithTimeInterval:120 target:self selector:@selector(backgroundSync) userInfo:nil repeats:YES]; 

...用下面的操作方法:

-(void) backgroundSync 
{ 
    ServerSync* serverSync = [[[ServerSync alloc]init]autorelease]; 
    serverSync.delegate = self; 
    [serverSync syncNow:nil]; 
} 

確保您使用startAsynchronous - 方法在ServerSync開始請求!

而且我建議實行單,然後用它這樣的:

-(void)init { 
    [[ServerSync sharedSync] setDelegate:self]; 
} 

-(void) backgroundSync 
{ 
    [[ServerSync sharedSync] syncNow]; 
} 
+0

是否有可能有ASIHTTPRequest在後臺線程或線程它是從所謂的執行? – iosdevnyc 2011-06-12 17:50:17

+0

@harekam_taj是的,你可以在ASIHTTPRequest子類中覆蓋'threadForRequest'。請參閱源代碼中的註釋('ASIHTTPRequest.m')。注意:這隻適用於高級用戶! – Felix 2011-06-12 18:35:23