2013-06-18 64 views
0

我是IOS新手我在用請求完成時的服務器響應來構建http請求。然而,我創建了一個新的對象來處理請求......IOS NSURLConnection和NSthread

至於我可以看到請求處理Asyncronusly這可以確保當請求正在處理

請記住我的應用程序不掛我運行在一個新的對象

-(void)signup 
{ 

NSLog(@"Signeduop"); 
//placing all the form fields in an array 
NSArray *fieldsArray; 
NSArray *keysArryay; 
keysArryay = [NSArray arrayWithObjects: 
       [NSString stringWithFormat:@"e_mail"], 
       [NSString stringWithFormat:@"MobileNo"], 
       [NSString stringWithFormat:@"DeviceType"], 
       [NSString stringWithFormat:@"AppleKey"], 
       [NSString stringWithFormat:@"FamilyKey"], 
       [NSString stringWithFormat:@"ServiceCompany"], 
       [NSString stringWithFormat:@"First_Name"], 
       [NSString stringWithFormat:@"Last_Name"], 
       [NSString stringWithFormat:@"ID"], 
       nil]; 

fieldsArray = [NSArray arrayWithObjects: 

       [NSString stringWithFormat:@"%@",txt_email.text], 
       [NSString stringWithFormat:@"%@",txt_telNo.text], 
       [NSString stringWithFormat:@"APPLE"], 
       [NSString stringWithFormat:@"PlaceheldforKey"], 
       [NSString stringWithFormat:@"%@",txt_familyKey.text], 
       [NSString stringWithFormat:@"%@",txt_serviceKey.text], 
       [NSString stringWithFormat:@"%@",txt_firstname.text], 
       [NSString stringWithFormat:@"%@",txt_lastname.text], 
       [NSString stringWithFormat:@"%@",txt_id.text] 
       ,nil]; 



NSDictionary *ValKeyDic = [NSDictionary dictionaryWithObjects:fieldsArray  forKeys:keysArryay]; 
NSError *error1 = [NSError alloc]; 

NSData *jsonData = [NSJSONSerialization dataWithJSONObject:ValKeyDic options:NSJSONWritingPrettyPrinted error:&error1]; 
NSString *jstring = [[NSString alloc]initWithData:jsonData encoding:NSUTF8StringEncoding]; 

NSLog(@" ===== %@", jstring); 



HttpClass * hy = [HttpClass alloc]; 

NSInteger varx = 45; 

[hy setMode:(int *)55]; 
//[hy AppWayRegistration:(NSInteger *)varx : jstring] ; 

dispatch_queue_t Queue = dispatch_queue_create("com.plump___________", 0); 
//dispatch_queue_t high =  dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,0); 
//dispatch_set_target_queue(Queue); 
dispatch_sync(Queue, ^{ [hy AppWayRegistration:(NSInteger *)varx : jstring]; }); 
//dispatch_d Queue); 

    int d =hy.RegistrationSucceededMethod; 
    NSLog(@"%d joooono",d); 

[hy RegistrationSucceededMethod]; 
//NSLog(@"J -- %d",[hy RegistrationSucceededMethod]); 



} 

代碼運行後它應該設置一個布爾值的子類這種請求[HY RegistrationSucceededMethod];

是BOOL當deligate已經在我的其他類運行NSURLConnections

-(void)connectionDidFinishLoading: (NSURLConnection *) connection 
{ 
//do something with the data 
    NSLog(@"Suckceeded! recieved %d bytes of data",[recieveData length]); 

    RegistrationSucceeded = TRUE ; 
    //[self RegistrationSucceededMethod]; 

} 

我的問題是我怎麼等待線程調用該對象之前完成網絡操作(即線程完成)設置

我的第二個問題是是線程知道connectionDidFinishLoading作爲其在該對象的deligate方法和它在該線程運行

我的第三個問題是什麼是處理HTTP請求再以正常的方式你的iOS應用程序正在等待響應,以執行下一個任務的贊助

非常感謝一個解決這個問題!

+0

我覺得這回答您的問題3.任何人:當你異步下載你通常不需要線程。這就是'NSURLConnection'爲你所做的。當你將所有數據加載到'NSURLConnection's [' - (void)connectionDidFinishLoading:(NSURLConnection *)connection'](http://developer.apple.com/library/mac/documentation/)中時,基金會/參考/ NSURLConnectionDelegate_Protocol/Reference/Reference.html#// apple_ref/doc/uid/TP40009947-CH1-BAJHIAJA) – HAS

回答

0

我建議檢查出 [NSURLConnection的sendAsynchronousRequest:隊列:completionHandler]

當它完成該請求它執行完成塊。在完成處理程序內部,您可以訪問下載的數據,然後執行其他操作。

我建議儘可能使用塊,因爲它們可以讓你的生活變得更容易,一旦你獲得了更好的控制。它們有助於避免包裝類包含委託回調方法,我想也只是有助於代碼的可讀性,因爲你基本上是說

[obj doThisFunction:^{ 
    andThenThisWhenYouFinish; 
}]; 

Apple docs on blocks

我喜歡塊很多,但我想他們會幫助你處理你的http響應。

+0

我肯定會試試這個,我之前沒有使用過塊我沒有完全理解它們,不幸的是包裝類是必要的,因爲將有許多http帖子和來自服務器的響應不同的信息,但其中許多人,所以我把它們包裝在一個可重用的類,爲了組織的緣故...到目前爲止因爲我知道塊數據是靜態的,不會考慮全局變量...感謝輸入 – Jono

+0

是的,塊是最好的,當你只是試圖下載一個文件或什麼的,但不是很好,如果你想處理所有請求刪除門方法。我過去做過的一件事實際上是創建一個處理程序類,它使用屬性來初始化,這些屬性是處理所有各種委託回調的塊。這樣我就可以用所有的回調來設置類,而不用擔心以後處理回調。 – mrosales

+0

嗯,這幾乎是我一直在嘗試做的......所以包裝工程很好唯一的是如何確定包裝完成其作業,因此dispatch_sync一旦完成,我可以抓住數據......或者你是指一個塊封裝 – Jono

0

終於找到了答案......我放棄Dispatch_async和二手NSthread ......在這裏幫助我,並從蘋果報價dev的文檔

簡單的方法來初始化OS X v10.5的一個NSThread對象後來是使用initWithTarget:selector:object:方法。此方法使用與detachNewThreadSelector:toTarget:withObject:方法完全相同的信息,並使用它來初始化新的NSThread實例。但是,它不啓動線程。要啓動線程,顯式調用線程對象的start方法,如下面的例子:

NSThread* myThread = [[NSThread alloc] initWithTarget:self 
            selector:@selector(myThreadMainMethod:) 
            object:nil]; 
[myThread start]; // Actually create the thread 

通過使用-isFinished -isExecuting我能夠的線程方法看的時候打電話給我布爾方法,如果方法仍在執行,我只是一個新的線程運行蒂莫在5秒內

要檢查是否存在被卡住線程

http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/Multithreading/CreatingThreads/CreatingThreads.html