2015-01-09 63 views
1

我已經創建了NSOperation類,我叫NSURLConnection獲取一些數據。 我打電話NSURLConnection使用NSOperation類中的主線程。 NSURLConnection的代表設置爲NSOperation類對象。 來自NSURLConnection的呼叫出現在主線程中。 我需要使用相同的操作線程處理這些數據。我如何實現這一目標?NSOperation + NSURLConnection

@implementation ModelCreationSearchOperation { 
    int try; 
} 

- (BOOL)isConcurrent 
{ 
    return YES; 
} 

- (void)start 
{ 
    [self willChangeValueForKey:@"isExecuting"]; 
    _isExecuting = YES; 
    [self didChangeValueForKey:@"isExecuting"]; 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     if (self.isCancelled) { 
      [self finish]; 
      return; 
     } 
    }); 

    [self fetchData]; 
} 

-(void)fetchData { 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     self.connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
    }); 
} 

- (void)finish 
{ 
    [self willChangeValueForKey:@"isExecuting"]; 
    [self willChangeValueForKey:@"isFinished"]; 

    _isExecuting = NO; 
    _isFinished = YES; 

    [self didChangeValueForKey:@"isExecuting"]; 
    [self didChangeValueForKey:@"isFinished"]; 

    [self cancel]; 
} 

- (void)connectionDidFinishLoading:(NSURLConnection *)connection { 
    //Main thread 
    //Want to perform parsing of response data on operation thread .... 
} 
+0

說明順便說一句,與您的問題無關,'isCancelled'邏輯不太正確。在設置'isExecuting'並調用'fetchData'之前,你應該檢查一下。將它分派到主隊列是沒有意義的(也是適得其反的,因爲你的'return'應該阻止獲取的發生,但是現在你只是從調度中返回,而'isExecuting'和' fetchData'正在發生,無論op是否被取消,這不是你想要的,我敢肯定)。另外,從iOS 7開始,你也應該實現'isAsynchronous'。 – Rob

+0

哦,是的......很棒的......感謝...... –

回答

1

你說你「想執行操作線程上的響應數據解析」。你真的需要運行它的操作線程,或者你只是需要把它從主線程?操作隊列不一定只有一個專用線程,所以這個問題不太合理。 (它是調度隊列和操作隊列的美女之一,它爲我們管理線程,我們通常不必涉及這些細節。)

如果您只是想讓代碼connectionDidFinishLoading運行一個後臺線程(例如,如果您在這個委託方法中做的事情異常緩慢),只需將其分派到後臺線程(您可以使用全局隊列)。如果你想爲這些connectionDidFinishLoading調用創建一個串行隊列,請爲此創建自己的串行隊列,並將此代碼發送到該隊列。但是,如果它不是太計算密集型(例如解析JSON或類似的東西),你可以經常讓它在主線程上運行而不會發生任何事情。另外,如果您真的想要,可以爲您的NSURLConnection委託調用創建一個專用線程,並在該線程上安排連接,但這通常是矯枉過正的。但請參閱AFNetworking代碼來了解此實現的示例。這是在How do I start an Asychronous NSURLConnection inside an NSOperation?

+0

是否需要使用nsoperation調用nsurlconnection? Nsurl連接本身運行在後臺線程..WHat可能是實際使用?? ..這將是偉大的,如果你可以提供更多的細節,如何爲urlconnection委託創建speacial線程..感謝... –

+0

「是否需要使用nsoperation調用nsurlconnection?「不,當然不。你應該這樣做,如果你想享受'NSOperation'的一些好處(例如每個請求包含好的對象,限制隊列上的併發程度,依賴等),但如果你不需要這樣做,使用'NSOperation'和'NSOperationQueue'。你是那個說你想用'NSOperation'包裝它的人,所以我認爲你有一個理由。 (就我個人而言,我總是這樣做,但很多人不這樣做。) – Rob

+0

關於爲'NSURLConnection'創建專用線程,你可以這樣做,但_why?_正如你指出的那樣,它已經異步運行,不管你從哪個線程啓動它,所以如果你擅長不阻止主線程(無論如何你都應該這樣做),這不是問題。但是,如果您真的需要這樣做,可以參考http://stackoverflow.com/a/17427268/1271826。但個人而言,我現在只是使用主隊列。 – Rob